@subwallet/extension-base 1.2.2-0 → 1.2.3-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 (72) hide show
  1. package/background/KoniTypes.d.ts +4 -0
  2. package/cjs/core/logic-validation/earning.js +47 -0
  3. package/cjs/core/logic-validation/swap.js +99 -0
  4. package/cjs/core/logic-validation/transfer.js +219 -0
  5. package/cjs/core/substrate/nominationpools-pallet.js +12 -0
  6. package/cjs/core/substrate/system-pallet.js +78 -0
  7. package/cjs/koni/api/dotsama/transfer.js +49 -4
  8. package/cjs/koni/api/staking/bonding/utils.js +1 -1
  9. package/cjs/koni/api/xcm/index.js +30 -2
  10. package/cjs/koni/background/handlers/Extension.js +135 -245
  11. package/cjs/packageInfo.js +1 -1
  12. package/cjs/services/balance-service/helpers/group.js +4 -27
  13. package/cjs/services/balance-service/helpers/subscribe/index.js +2 -30
  14. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +41 -80
  15. package/cjs/services/balance-service/index.js +11 -9
  16. package/cjs/services/chain-service/index.js +0 -1
  17. package/cjs/services/chain-service/utils/index.js +6 -0
  18. package/cjs/services/earning-service/handlers/base.js +1 -1
  19. package/cjs/services/earning-service/handlers/special.js +11 -12
  20. package/cjs/services/swap-service/handler/base-handler.js +28 -44
  21. package/cjs/services/swap-service/handler/chainflip-handler.js +23 -21
  22. package/cjs/services/swap-service/handler/hydradx-handler.js +40 -38
  23. package/cjs/services/swap-service/index.js +6 -0
  24. package/cjs/services/swap-service/utils.js +8 -49
  25. package/cjs/services/transaction-service/index.js +66 -155
  26. package/core/logic-validation/earning.d.ts +10 -0
  27. package/core/logic-validation/earning.js +37 -0
  28. package/core/logic-validation/swap.d.ts +8 -0
  29. package/core/logic-validation/swap.js +89 -0
  30. package/core/logic-validation/transfer.d.ts +16 -0
  31. package/core/logic-validation/transfer.js +206 -0
  32. package/core/substrate/nominationpools-pallet.d.ts +7 -0
  33. package/core/substrate/nominationpools-pallet.js +6 -0
  34. package/core/substrate/system-pallet.d.ts +27 -0
  35. package/core/substrate/system-pallet.js +71 -0
  36. package/koni/api/dotsama/transfer.d.ts +3 -1
  37. package/koni/api/dotsama/transfer.js +44 -1
  38. package/koni/api/staking/bonding/relayChain.d.ts +2 -1
  39. package/koni/api/staking/bonding/utils.js +1 -1
  40. package/koni/api/xcm/index.d.ts +2 -0
  41. package/koni/api/xcm/index.js +27 -1
  42. package/koni/background/handlers/Extension.d.ts +5 -5
  43. package/koni/background/handlers/Extension.js +111 -221
  44. package/package.json +34 -9
  45. package/packageInfo.js +1 -1
  46. package/services/balance-service/helpers/group.js +4 -27
  47. package/services/balance-service/helpers/subscribe/index.d.ts +2 -1
  48. package/services/balance-service/helpers/subscribe/index.js +2 -30
  49. package/services/balance-service/helpers/subscribe/substrate/index.d.ts +2 -1
  50. package/services/balance-service/helpers/subscribe/substrate/index.js +26 -64
  51. package/services/balance-service/index.d.ts +7 -6
  52. package/services/balance-service/index.js +12 -10
  53. package/services/chain-service/index.js +0 -1
  54. package/services/chain-service/utils/index.d.ts +1 -0
  55. package/services/chain-service/utils/index.js +4 -0
  56. package/services/earning-service/handlers/base.js +1 -1
  57. package/services/earning-service/handlers/nomination-pool/index.d.ts +2 -1
  58. package/services/earning-service/handlers/special.js +11 -12
  59. package/services/swap-service/handler/base-handler.d.ts +3 -2
  60. package/services/swap-service/handler/base-handler.js +26 -42
  61. package/services/swap-service/handler/chainflip-handler.d.ts +2 -1
  62. package/services/swap-service/handler/chainflip-handler.js +4 -2
  63. package/services/swap-service/handler/hydradx-handler.d.ts +2 -1
  64. package/services/swap-service/handler/hydradx-handler.js +7 -5
  65. package/services/swap-service/index.js +7 -1
  66. package/services/swap-service/utils.d.ts +2 -4
  67. package/services/swap-service/utils.js +7 -47
  68. package/services/transaction-service/index.d.ts +1 -1
  69. package/services/transaction-service/index.js +30 -119
  70. package/services/transaction-service/types.d.ts +1 -0
  71. package/types/balance/index.d.ts +6 -10
  72. package/types/yield/info/pallet.d.ts +0 -6
@@ -4,18 +4,14 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.SWAP_QUOTE_TIMEOUT_MAP = exports.MOCK_SWAP_FEE = exports.DEFAULT_SWAP_FIRST_STEP = exports.CHAIN_FLIP_TESTNET_EXPLORER = exports.CHAIN_FLIP_SUPPORTED_TESTNET_MAPPING = exports.CHAIN_FLIP_SUPPORTED_TESTNET_ASSET_MAPPING = exports.CHAIN_FLIP_SUPPORTED_MAINNET_MAPPING = exports.CHAIN_FLIP_SUPPORTED_MAINNET_ASSET_MAPPING = exports.CHAIN_FLIP_MAINNET_EXPLORER = void 0;
7
+ exports._PROVIDER_TO_SUPPORTED_PAIR_MAP = exports.SWAP_QUOTE_TIMEOUT_MAP = exports.MOCK_SWAP_FEE = exports.DEFAULT_SWAP_FIRST_STEP = exports.CHAIN_FLIP_TESTNET_EXPLORER = exports.CHAIN_FLIP_SUPPORTED_TESTNET_MAPPING = exports.CHAIN_FLIP_SUPPORTED_TESTNET_ASSET_MAPPING = exports.CHAIN_FLIP_SUPPORTED_MAINNET_MAPPING = exports.CHAIN_FLIP_SUPPORTED_MAINNET_ASSET_MAPPING = exports.CHAIN_FLIP_MAINNET_EXPLORER = void 0;
8
8
  exports.calculateSwapRate = calculateSwapRate;
9
- exports.getChainflipEarlyValidationError = getChainflipEarlyValidationError;
10
- exports.getEarlyHydradxValidationError = getEarlyHydradxValidationError;
11
9
  exports.getSwapAltToken = getSwapAltToken;
12
10
  exports.getSwapAlternativeAsset = getSwapAlternativeAsset;
13
11
  var _swap = require("@chainflip/sdk/swap");
14
12
  var _chainList = require("@subwallet/chain-list");
15
- var _SwapError = require("@subwallet/extension-base/background/errors/SwapError");
16
13
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
17
14
  var _swap2 = require("@subwallet/extension-base/types/swap");
18
- var _utils2 = require("@subwallet/extension-base/utils");
19
15
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
20
16
  // Copyright 2019-2022 @subwallet/extension-base
21
17
  // SPDX-License-Identifier: Apache-2.0
@@ -65,6 +61,13 @@ const MOCK_SWAP_FEE = {
65
61
  feeOptions: []
66
62
  };
67
63
  exports.MOCK_SWAP_FEE = MOCK_SWAP_FEE;
64
+ const _PROVIDER_TO_SUPPORTED_PAIR_MAP = {
65
+ [_swap2.SwapProviderId.HYDRADX_MAINNET]: [_chainList.COMMON_CHAIN_SLUGS.HYDRADX],
66
+ [_swap2.SwapProviderId.HYDRADX_TESTNET]: [_chainList.COMMON_CHAIN_SLUGS.HYDRADX_TESTNET],
67
+ [_swap2.SwapProviderId.CHAIN_FLIP_MAINNET]: [_chainList.COMMON_CHAIN_SLUGS.POLKADOT, _chainList.COMMON_CHAIN_SLUGS.ETHEREUM],
68
+ [_swap2.SwapProviderId.CHAIN_FLIP_TESTNET]: [_chainList.COMMON_CHAIN_SLUGS.CHAINFLIP_POLKADOT, _chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA]
69
+ };
70
+ exports._PROVIDER_TO_SUPPORTED_PAIR_MAP = _PROVIDER_TO_SUPPORTED_PAIR_MAP;
68
71
  function getSwapAlternativeAsset(swapPair) {
69
72
  var _swapPair$metadata;
70
73
  return swapPair === null || swapPair === void 0 ? void 0 : (_swapPair$metadata = swapPair.metadata) === null || _swapPair$metadata === void 0 ? void 0 : _swapPair$metadata.alternativeAsset;
@@ -79,48 +82,4 @@ function calculateSwapRate(fromAmount, toAmount, fromAsset, toAsset) {
79
82
  const decimalDiff = (0, _utils._getAssetDecimals)(toAsset) - (0, _utils._getAssetDecimals)(fromAsset);
80
83
  const bnRate = bnFromAmount.div(bnToAmount);
81
84
  return 1 / bnRate.times(10 ** decimalDiff).toNumber();
82
- }
83
- function getChainflipEarlyValidationError(error, metadata) {
84
- // todo: support more providers
85
- switch (error) {
86
- case _swap2.SwapErrorType.NOT_MEET_MIN_SWAP:
87
- {
88
- const parsedMinSwapValue = (0, _utils2.formatNumber)(metadata.minSwap.value, metadata.minSwap.decimals);
89
- const message = `Amount too low. Increase your amount above ${parsedMinSwapValue} ${metadata.minSwap.symbol} and try again`;
90
- return new _SwapError.SwapError(error, message);
91
- }
92
- case _swap2.SwapErrorType.SWAP_EXCEED_ALLOWANCE:
93
- {
94
- if (metadata.maxSwap) {
95
- const parsedMaxSwapValue = (0, _utils2.formatNumber)(metadata.maxSwap.value, metadata.maxSwap.decimals);
96
- return new _SwapError.SwapError(error, `Amount too high. Lower your amount below ${parsedMaxSwapValue} ${metadata.maxSwap.symbol} and try again`);
97
- } else {
98
- return new _SwapError.SwapError(error, 'Amount too high. Lower your amount and try again');
99
- }
100
- }
101
- case _swap2.SwapErrorType.ASSET_NOT_SUPPORTED:
102
- return new _SwapError.SwapError(error, 'This swap pair is not supported');
103
- case _swap2.SwapErrorType.UNKNOWN:
104
- return new _SwapError.SwapError(error, `Undefined error. Check your Internet and ${metadata.chain.slug} connection or contact support`);
105
- case _swap2.SwapErrorType.ERROR_FETCHING_QUOTE:
106
- return new _SwapError.SwapError(error, 'No swap quote found. Adjust your amount or try again later.');
107
- default:
108
- return new _SwapError.SwapError(error);
109
- }
110
- }
111
- function getEarlyHydradxValidationError(error, metadata) {
112
- switch (error) {
113
- case _swap2.SwapErrorType.AMOUNT_CANNOT_BE_ZERO:
114
- {
115
- return new _SwapError.SwapError(error, 'Amount too low. Increase your amount above 0 and try again');
116
- }
117
- case _swap2.SwapErrorType.ASSET_NOT_SUPPORTED:
118
- return new _SwapError.SwapError(error, 'This swap pair is not supported');
119
- case _swap2.SwapErrorType.UNKNOWN:
120
- return new _SwapError.SwapError(error, `Undefined error. Check your Internet and ${metadata.chain.slug} connection or contact support`);
121
- case _swap2.SwapErrorType.ERROR_FETCHING_QUOTE:
122
- return new _SwapError.SwapError(error, 'No swap quote found. Adjust your amount or try again later.');
123
- default:
124
- return new _SwapError.SwapError(error);
125
- }
126
85
  }
@@ -8,30 +8,27 @@ exports.default = void 0;
8
8
  var _EvmProviderError = require("@subwallet/extension-base/background/errors/EvmProviderError");
9
9
  var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
10
10
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
11
- var _TransactionWarning = require("@subwallet/extension-base/background/warnings/TransactionWarning");
12
11
  var _constants = require("@subwallet/extension-base/constants");
12
+ var _transfer = require("@subwallet/extension-base/core/logic-validation/transfer");
13
13
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
14
- var _utils2 = require("@subwallet/extension-base/services/fee-service/utils");
15
14
  var _constants2 = require("@subwallet/extension-base/services/request-service/constants");
16
15
  var _constants3 = require("@subwallet/extension-base/services/transaction-service/constants");
17
16
  var _eventParser = require("@subwallet/extension-base/services/transaction-service/event-parser");
18
17
  var _helpers = require("@subwallet/extension-base/services/transaction-service/helpers");
19
- var _utils3 = require("@subwallet/extension-base/services/transaction-service/utils");
18
+ var _utils2 = require("@subwallet/extension-base/services/transaction-service/utils");
20
19
  var _helpers2 = require("@subwallet/extension-base/services/wallet-connect-service/helpers");
21
20
  var _types = require("@subwallet/extension-base/types");
22
- var _utils4 = require("@subwallet/extension-base/utils");
21
+ var _utils3 = require("@subwallet/extension-base/utils");
23
22
  var _mergeTransactionAndSignature = require("@subwallet/extension-base/utils/eth/mergeTransactionAndSignature");
24
23
  var _parseTransaction = require("@subwallet/extension-base/utils/eth/parseTransaction");
25
24
  var _number = require("@subwallet/extension-base/utils/number");
26
25
  var _uiKeyring = _interopRequireDefault(require("@subwallet/ui-keyring"));
27
- var _bignumber = _interopRequireDefault(require("bignumber.js"));
28
26
  var _ethereumjsUtil = require("ethereumjs-util");
29
27
  var _ethers = require("ethers");
30
28
  var _eventemitter = _interopRequireDefault(require("eventemitter3"));
31
29
  var _i18next = require("i18next");
32
30
  var _rxjs = require("rxjs");
33
31
  var _util = require("@polkadot/util");
34
- var _constants4 = require("../chain-service/constants");
35
32
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
36
33
  // SPDX-License-Identifier: Apache-2.0
37
34
 
@@ -65,134 +62,48 @@ class TransactionService {
65
62
  }
66
63
  return [];
67
64
  }
68
- async generalValidate(validationInput) {
69
- const validation = {
70
- ...validationInput,
71
- errors: validationInput.errors || [],
72
- warnings: validationInput.warnings || []
65
+ async validateTransaction(transactionInput) {
66
+ const validationResponse = {
67
+ ...transactionInput,
68
+ status: undefined,
69
+ errors: transactionInput.errors || [],
70
+ warnings: transactionInput.warnings || []
73
71
  };
74
72
  const {
75
73
  additionalValidator,
76
74
  address,
77
75
  chain,
78
- edAsWarning,
79
- extrinsicType,
80
- isTransferAll,
81
- transaction
82
- } = validation;
83
-
84
- // Check duplicate transaction
85
- validation.errors.push(...this.checkDuplicate(validationInput));
76
+ extrinsicType
77
+ } = validationResponse;
78
+ const transaction = transactionInput.transaction;
86
79
 
87
- // Return unsupported error if not found transaction
88
- if (!transaction) {
89
- if (extrinsicType === _KoniTypes.ExtrinsicType.SEND_NFT) {
90
- validation.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.UNSUPPORTED, (0, _i18next.t)('This feature is not yet available for this NFT')));
91
- } else {
92
- validation.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.UNSUPPORTED));
93
- }
94
- }
95
- const validationResponse = {
96
- status: undefined,
97
- ...validation
98
- };
80
+ // Check duplicated transaction
81
+ validationResponse.errors.push(...this.checkDuplicate(transactionInput));
99
82
 
100
- // Estimate fee
101
- const estimateFee = {
102
- symbol: '',
103
- decimals: 0,
104
- value: '',
105
- tooHigh: false
106
- };
83
+ // Check support for transaction
84
+ (0, _transfer.checkSupportForTransaction)(validationResponse, transaction);
107
85
  const chainInfo = this.state.chainService.getChainInfoByKey(chain);
108
86
  if (!chainInfo) {
109
87
  validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR, (0, _i18next.t)('Cannot find network')));
110
- } else {
111
- const {
112
- decimals,
113
- symbol
114
- } = (0, _utils._getChainNativeTokenBasicInfo)(chainInfo);
115
- estimateFee.decimals = decimals;
116
- estimateFee.symbol = symbol;
117
- if (transaction) {
118
- try {
119
- if ((0, _helpers.isSubstrateTransaction)(transaction)) {
120
- estimateFee.value = (await transaction.paymentInfo(address)).partialFee.toString();
121
- } else {
122
- const web3 = this.state.chainService.getEvmApi(chain);
123
- if (!web3) {
124
- validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.CHAIN_DISCONNECTED, undefined));
125
- } else {
126
- const gasLimit = await web3.api.eth.estimateGas(transaction);
127
- const priority = await (0, _utils2.calculateGasFeeParams)(web3, chainInfo.slug);
128
- if (priority.baseGasFee) {
129
- const maxFee = priority.maxFeePerGas; // TODO: Need review
130
-
131
- estimateFee.value = maxFee.multipliedBy(gasLimit).toFixed(0);
132
- } else {
133
- estimateFee.value = new _bignumber.default(priority.gasPrice).multipliedBy(gasLimit).toFixed(0);
134
- }
135
- estimateFee.tooHigh = priority.busyNetwork;
136
- }
137
- }
138
- } catch (e) {
139
- const error = e;
140
- if (error.message.includes('gas required exceeds allowance') && error.message.includes('insufficient funds')) {
141
- validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_BALANCE));
142
- }
143
- estimateFee.value = '0';
144
- }
145
- }
146
88
  }
147
- validationResponse.estimateFee = estimateFee;
148
-
149
- // Read-only account
150
- const pair = _uiKeyring.default.getPair(address);
151
- if (!pair) {
152
- validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR, (0, _i18next.t)('Unable to find account')));
153
- } else {
154
- var _pair$meta;
155
- if ((_pair$meta = pair.meta) !== null && _pair$meta !== void 0 && _pair$meta.isReadOnly) {
156
- validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR, (0, _i18next.t)('This account is watch-only')));
157
- }
89
+ const evmApi = this.state.chainService.getEvmApi(chainInfo.slug);
90
+ const isNeedEvmApi = transaction && !(0, _helpers.isSubstrateTransaction)(transaction) && !evmApi;
91
+ if (isNeedEvmApi) {
92
+ validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.CHAIN_DISCONNECTED, undefined));
158
93
  }
159
94
 
160
- // Balance
161
- const transferNative = validationResponse.transferNativeAmount || '0';
95
+ // Estimate fee for transaction
96
+ validationResponse.estimateFee = await (0, _transfer.estimateFeeForTransaction)(validationResponse, transaction, chainInfo, evmApi);
97
+
98
+ // Check account signing transaction
99
+ (0, _transfer.checkSigningAccountForTransaction)(validationResponse);
162
100
  const nativeTokenInfo = this.state.chainService.getNativeTokenInfo(chain);
163
- const balance = await this.state.balanceService.getTokenFreeBalance(address, chain, nativeTokenInfo.slug);
164
- const existentialDeposit = nativeTokenInfo.minAmount || '0';
165
- const feeNum = parseInt(estimateFee.value);
166
- const balanceNum = parseInt(balance.value);
167
- const edNum = parseInt(existentialDeposit);
168
- const transferNativeNum = parseInt(transferNative);
169
- if (!validationInput.skipFeeValidation) {
170
- // TODO
171
- if (!new _bignumber.default(balance.value).gt(0)) {
172
- validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_BALANCE));
173
- }
174
- if (transferNativeNum + feeNum > balanceNum) {
175
- if (!isTransferAll) {
176
- validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_BALANCE));
177
- } else {
178
- if ([..._constants4._TRANSFER_CHAIN_GROUP.acala, ..._constants4._TRANSFER_CHAIN_GROUP.genshiro, ..._constants4._TRANSFER_CHAIN_GROUP.bitcountry, ..._constants4._TRANSFER_CHAIN_GROUP.statemine].includes(chain)) {
179
- // Chain not have transfer all function
180
- validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_BALANCE));
181
- }
182
- }
183
- }
184
- if (!isTransferAll) {
185
- if (balanceNum - (transferNativeNum + feeNum) < edNum) {
186
- if (edAsWarning) {
187
- validationResponse.warnings.push(new _TransactionWarning.TransactionWarning(_KoniTypes.BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT));
188
- } else {
189
- validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_EXISTENTIAL_DEPOSIT));
190
- }
191
- }
192
- }
193
- }
101
+ const nativeTokenAvailable = await this.state.balanceService.getTransferableBalance(address, chain, nativeTokenInfo.slug, extrinsicType);
102
+
103
+ // Check available balance against transaction fee
104
+ (0, _transfer.checkBalanceWithTransactionFee)(validationResponse, transactionInput, nativeTokenInfo, nativeTokenAvailable);
194
105
 
195
- // Validate transaction with additionalValidator method
106
+ // Check additional validations
196
107
  additionalValidator && (await additionalValidator(validationResponse));
197
108
  return validationResponse;
198
109
  }
@@ -242,7 +153,7 @@ class TransactionService {
242
153
  };
243
154
  }
244
155
  async handleTransaction(transaction) {
245
- const validatedTransaction = await this.generalValidate(transaction);
156
+ const validatedTransaction = await this.validateTransaction(transaction);
246
157
  const stopByErrors = validatedTransaction.errors.length > 0;
247
158
  const stopByWarnings = validatedTransaction.warnings.length > 0 && !validatedTransaction.ignoreWarnings;
248
159
  if (stopByErrors || stopByWarnings) {
@@ -341,13 +252,13 @@ class TransactionService {
341
252
  getTransactionLink(id) {
342
253
  const transaction = this.getTransaction(id);
343
254
  const chainInfo = this.state.chainService.getChainInfoByKey(transaction.chain);
344
- return (0, _utils3.getExplorerLink)(chainInfo, transaction.extrinsicHash, 'tx');
255
+ return (0, _utils2.getExplorerLink)(chainInfo, transaction.extrinsicHash, 'tx');
345
256
  }
346
257
  transactionToHistories(id, startBlock, nonce, eventLogs) {
347
258
  const transaction = this.getTransaction(id);
348
259
  const extrinsicType = transaction.extrinsicType;
349
260
  const chainInfo = this.state.chainService.getChainInfoByKey(transaction.chain);
350
- const formattedTransactionAddress = (0, _utils4.reformatAddress)(transaction.address);
261
+ const formattedTransactionAddress = (0, _utils3.reformatAddress)(transaction.address);
351
262
  const historyItem = {
352
263
  origin: 'app',
353
264
  chain: transaction.chain,
@@ -380,7 +291,7 @@ class TransactionService {
380
291
  switch (extrinsicType) {
381
292
  case _KoniTypes.ExtrinsicType.TRANSFER_BALANCE:
382
293
  {
383
- const inputData = (0, _utils3.parseTransactionData)(transaction.data);
294
+ const inputData = (0, _utils2.parseTransactionData)(transaction.data);
384
295
  historyItem.to = inputData.to;
385
296
  const sendingTokenInfo = this.state.chainService.getAssetBySlug(inputData.tokenSlug);
386
297
  historyItem.amount = {
@@ -393,7 +304,7 @@ class TransactionService {
393
304
  break;
394
305
  case _KoniTypes.ExtrinsicType.TRANSFER_TOKEN:
395
306
  {
396
- const inputData = (0, _utils3.parseTransactionData)(transaction.data);
307
+ const inputData = (0, _utils2.parseTransactionData)(transaction.data);
397
308
  historyItem.to = inputData.to;
398
309
  const sendingTokenInfo = this.state.chainService.getAssetBySlug(inputData.tokenSlug);
399
310
  historyItem.amount = {
@@ -406,7 +317,7 @@ class TransactionService {
406
317
  break;
407
318
  case _KoniTypes.ExtrinsicType.TRANSFER_XCM:
408
319
  {
409
- const inputData = (0, _utils3.parseTransactionData)(transaction.data);
320
+ const inputData = (0, _utils2.parseTransactionData)(transaction.data);
410
321
  historyItem.to = inputData.to;
411
322
  const sendingTokenInfo = this.state.chainService.getAssetBySlug(inputData.tokenSlug);
412
323
  historyItem.amount = {
@@ -426,7 +337,7 @@ class TransactionService {
426
337
  break;
427
338
  case _KoniTypes.ExtrinsicType.SEND_NFT:
428
339
  {
429
- const inputData = (0, _utils3.parseTransactionData)(transaction.data);
340
+ const inputData = (0, _utils2.parseTransactionData)(transaction.data);
430
341
  historyItem.to = inputData.recipientAddress;
431
342
  historyItem.amount = {
432
343
  decimals: 0,
@@ -437,7 +348,7 @@ class TransactionService {
437
348
  break;
438
349
  case _KoniTypes.ExtrinsicType.STAKING_BOND:
439
350
  {
440
- const data = (0, _utils3.parseTransactionData)(transaction.data);
351
+ const data = (0, _utils2.parseTransactionData)(transaction.data);
441
352
  historyItem.amount = {
442
353
  ...baseNativeAmount,
443
354
  value: data.amount || '0'
@@ -446,7 +357,7 @@ class TransactionService {
446
357
  break;
447
358
  case _KoniTypes.ExtrinsicType.STAKING_JOIN_POOL:
448
359
  {
449
- const data = (0, _utils3.parseTransactionData)(transaction.data);
360
+ const data = (0, _utils2.parseTransactionData)(transaction.data);
450
361
  historyItem.amount = {
451
362
  ...baseNativeAmount,
452
363
  value: data.amount || '0'
@@ -456,7 +367,7 @@ class TransactionService {
456
367
  break;
457
368
  case _KoniTypes.ExtrinsicType.STAKING_UNBOND:
458
369
  {
459
- const data = (0, _utils3.parseTransactionData)(transaction.data);
370
+ const data = (0, _utils2.parseTransactionData)(transaction.data);
460
371
  if (data.isLiquidStaking && data.derivativeTokenInfo && data.exchangeRate && data.inputTokenInfo) {
461
372
  historyItem.amount = {
462
373
  decimals: (0, _utils._getAssetDecimals)(data.derivativeTokenInfo),
@@ -478,7 +389,7 @@ class TransactionService {
478
389
  break;
479
390
  case _KoniTypes.ExtrinsicType.STAKING_LEAVE_POOL:
480
391
  {
481
- const data = (0, _utils3.parseTransactionData)(transaction.data);
392
+ const data = (0, _utils2.parseTransactionData)(transaction.data);
482
393
  historyItem.to = data.address || '';
483
394
  historyItem.amount = {
484
395
  ...baseNativeAmount,
@@ -488,7 +399,7 @@ class TransactionService {
488
399
  break;
489
400
  case _KoniTypes.ExtrinsicType.STAKING_CLAIM_REWARD:
490
401
  {
491
- const data = (0, _utils3.parseTransactionData)(transaction.data);
402
+ const data = (0, _utils2.parseTransactionData)(transaction.data);
492
403
  historyItem.amount = {
493
404
  ...baseNativeAmount,
494
405
  value: data.unclaimedReward || '0'
@@ -497,7 +408,7 @@ class TransactionService {
497
408
  break;
498
409
  case _KoniTypes.ExtrinsicType.STAKING_WITHDRAW:
499
410
  {
500
- const data = (0, _utils3.parseTransactionData)(transaction.data);
411
+ const data = (0, _utils2.parseTransactionData)(transaction.data);
501
412
  const slug = data.slug;
502
413
  const poolHandler = this.state.earningService.getPoolHandler(slug);
503
414
  const amount = {
@@ -517,7 +428,7 @@ class TransactionService {
517
428
  }
518
429
  case _KoniTypes.ExtrinsicType.STAKING_CANCEL_UNSTAKE:
519
430
  {
520
- const data = (0, _utils3.parseTransactionData)(transaction.data);
431
+ const data = (0, _utils2.parseTransactionData)(transaction.data);
521
432
  historyItem.amount = {
522
433
  ...baseNativeAmount,
523
434
  value: data.selectedUnstaking.claimable || '0'
@@ -527,7 +438,7 @@ class TransactionService {
527
438
  case _KoniTypes.ExtrinsicType.EVM_EXECUTE:
528
439
  {
529
440
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
530
- const data = (0, _utils3.parseTransactionData)(transaction.data);
441
+ const data = (0, _utils2.parseTransactionData)(transaction.data);
531
442
 
532
443
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access
533
444
  historyItem.to = (data === null || data === void 0 ? void 0 : data.to) || '';
@@ -542,7 +453,7 @@ class TransactionService {
542
453
  // eslint-disable-next-line no-fallthrough
543
454
  case _KoniTypes.ExtrinsicType.MINT_VDOT:
544
455
  {
545
- const params = (0, _utils3.parseTransactionData)(transaction.data);
456
+ const params = (0, _utils2.parseTransactionData)(transaction.data);
546
457
  const inputTokenInfo = this.state.chainService.getAssetBySlug(params.inputTokenSlug);
547
458
  const isFeePaidWithInputAsset = params.feeTokenSlug === params.inputTokenSlug;
548
459
  historyItem.amount = {
@@ -564,7 +475,7 @@ class TransactionService {
564
475
  // eslint-disable-next-line no-fallthrough
565
476
  case _KoniTypes.ExtrinsicType.REDEEM_QDOT:
566
477
  {
567
- const data = (0, _utils3.parseTransactionData)(transaction.data);
478
+ const data = (0, _utils2.parseTransactionData)(transaction.data);
568
479
  const yieldPoolInfo = data.poolInfo;
569
480
  if (yieldPoolInfo.metadata.derivativeAssets) {
570
481
  const inputTokenSlug = yieldPoolInfo.metadata.inputAsset;
@@ -603,7 +514,7 @@ class TransactionService {
603
514
  // eslint-disable-next-line no-fallthrough
604
515
  case _KoniTypes.ExtrinsicType.REDEEM_VDOT:
605
516
  {
606
- const data = (0, _utils3.parseTransactionData)(transaction.data);
517
+ const data = (0, _utils2.parseTransactionData)(transaction.data);
607
518
  const yieldPoolInfo = data.poolInfo;
608
519
  const minAmountPercents = this.state.earningService.getMinAmountPercent();
609
520
  if (yieldPoolInfo.metadata.derivativeAssets) {
@@ -637,7 +548,7 @@ class TransactionService {
637
548
  }
638
549
  case _KoniTypes.ExtrinsicType.TOKEN_APPROVE:
639
550
  {
640
- const data = (0, _utils3.parseTransactionData)(transaction.data);
551
+ const data = (0, _utils2.parseTransactionData)(transaction.data);
641
552
  const inputAsset = this.state.chainService.getAssetBySlug(data.inputTokenSlug);
642
553
  historyItem.amount = {
643
554
  value: '0',
@@ -648,7 +559,7 @@ class TransactionService {
648
559
  }
649
560
  case _KoniTypes.ExtrinsicType.SWAP:
650
561
  {
651
- const data = (0, _utils3.parseTransactionData)(transaction.data); // TODO: switch by provider
562
+ const data = (0, _utils2.parseTransactionData)(transaction.data); // TODO: switch by provider
652
563
  const inputAsset = this.state.chainService.getAssetBySlug(data.quote.pair.from);
653
564
  historyItem.amount = {
654
565
  value: data.quote.fromAmount,
@@ -673,7 +584,7 @@ class TransactionService {
673
584
  switch (extrinsicType) {
674
585
  case _KoniTypes.ExtrinsicType.TRANSFER_XCM:
675
586
  {
676
- const inputData = (0, _utils3.parseTransactionData)(transaction.data);
587
+ const inputData = (0, _utils2.parseTransactionData)(transaction.data);
677
588
  receiverHistory.chain = inputData.destinationNetworkKey;
678
589
  break;
679
590
  }
@@ -734,7 +645,7 @@ class TransactionService {
734
645
  // must be done after success/failure to make sure the transaction is finalized
735
646
  const transaction = this.getTransaction(id);
736
647
  if (transaction.extrinsicType === _KoniTypes.ExtrinsicType.SEND_NFT) {
737
- const inputData = (0, _utils3.parseTransactionData)(transaction.data);
648
+ const inputData = (0, _utils2.parseTransactionData)(transaction.data);
738
649
  try {
739
650
  const sender = _uiKeyring.default.getPair(inputData.senderAddress);
740
651
  sender && this.state.dbService.handleNftTransfer(transaction.chain, [sender.address, _constants.ALL_ACCOUNT_KEY], inputData.nftItem).then(() => {
@@ -755,7 +666,7 @@ class TransactionService {
755
666
  } else if ([_KoniTypes.ExtrinsicType.STAKING_BOND, _KoniTypes.ExtrinsicType.STAKING_UNBOND, _KoniTypes.ExtrinsicType.STAKING_WITHDRAW, _KoniTypes.ExtrinsicType.STAKING_CANCEL_UNSTAKE, _KoniTypes.ExtrinsicType.STAKING_CLAIM_REWARD, _KoniTypes.ExtrinsicType.STAKING_JOIN_POOL, _KoniTypes.ExtrinsicType.STAKING_POOL_WITHDRAW, _KoniTypes.ExtrinsicType.STAKING_LEAVE_POOL].includes(transaction.extrinsicType)) {
756
667
  this.state.eventService.emit('transaction.submitStaking', transaction.chain);
757
668
  } else if (transaction.extrinsicType === _KoniTypes.ExtrinsicType.SWAP) {
758
- const inputData = (0, _utils3.parseTransactionData)(transaction.data);
669
+ const inputData = (0, _utils2.parseTransactionData)(transaction.data);
759
670
  const toAssetSlug = inputData.quote.pair.to;
760
671
 
761
672
  // todo: consider async
@@ -883,16 +794,16 @@ class TransactionService {
883
794
  generateHashPayload(chain, transaction) {
884
795
  const chainInfo = this.state.chainService.getChainInfoByKey(chain);
885
796
  let txObject;
886
- const max = (0, _utils4.anyNumberToBN)(transaction.maxFeePerGas);
797
+ const max = (0, _utils3.anyNumberToBN)(transaction.maxFeePerGas);
887
798
  if (max.gt(_number.BN_ZERO)) {
888
799
  var _transaction$nonce;
889
800
  txObject = {
890
801
  nonce: (_transaction$nonce = transaction.nonce) !== null && _transaction$nonce !== void 0 ? _transaction$nonce : 0,
891
- maxFeePerGas: (0, _ethereumjsUtil.addHexPrefix)((0, _utils4.anyNumberToBN)(transaction.maxFeePerGas).toString(16)),
892
- maxPriorityFeePerGas: (0, _ethereumjsUtil.addHexPrefix)((0, _utils4.anyNumberToBN)(transaction.maxPriorityFeePerGas).toString(16)),
893
- gasLimit: (0, _ethereumjsUtil.addHexPrefix)((0, _utils4.anyNumberToBN)(transaction.gas).toString(16)),
802
+ maxFeePerGas: (0, _ethereumjsUtil.addHexPrefix)((0, _utils3.anyNumberToBN)(transaction.maxFeePerGas).toString(16)),
803
+ maxPriorityFeePerGas: (0, _ethereumjsUtil.addHexPrefix)((0, _utils3.anyNumberToBN)(transaction.maxPriorityFeePerGas).toString(16)),
804
+ gasLimit: (0, _ethereumjsUtil.addHexPrefix)((0, _utils3.anyNumberToBN)(transaction.gas).toString(16)),
894
805
  to: transaction.to,
895
- value: (0, _ethereumjsUtil.addHexPrefix)((0, _utils4.anyNumberToBN)(transaction.value).toString(16)),
806
+ value: (0, _ethereumjsUtil.addHexPrefix)((0, _utils3.anyNumberToBN)(transaction.value).toString(16)),
896
807
  data: transaction.data,
897
808
  chainId: (0, _utils._getEvmChainId)(chainInfo),
898
809
  type: 2
@@ -901,10 +812,10 @@ class TransactionService {
901
812
  var _transaction$nonce2;
902
813
  txObject = {
903
814
  nonce: (_transaction$nonce2 = transaction.nonce) !== null && _transaction$nonce2 !== void 0 ? _transaction$nonce2 : 0,
904
- gasPrice: (0, _ethereumjsUtil.addHexPrefix)((0, _utils4.anyNumberToBN)(transaction.gasPrice).toString(16)),
905
- gasLimit: (0, _ethereumjsUtil.addHexPrefix)((0, _utils4.anyNumberToBN)(transaction.gas).toString(16)),
815
+ gasPrice: (0, _ethereumjsUtil.addHexPrefix)((0, _utils3.anyNumberToBN)(transaction.gasPrice).toString(16)),
816
+ gasLimit: (0, _ethereumjsUtil.addHexPrefix)((0, _utils3.anyNumberToBN)(transaction.gas).toString(16)),
906
817
  to: transaction.to,
907
- value: (0, _ethereumjsUtil.addHexPrefix)((0, _utils4.anyNumberToBN)(transaction.value).toString(16)),
818
+ value: (0, _ethereumjsUtil.addHexPrefix)((0, _utils3.anyNumberToBN)(transaction.value).toString(16)),
908
819
  data: transaction.data,
909
820
  chainId: (0, _utils._getEvmChainId)(chainInfo),
910
821
  type: 0
@@ -974,12 +885,12 @@ class TransactionService {
974
885
  const txObject = {
975
886
  nonce: (_payload$nonce = payload.nonce) !== null && _payload$nonce !== void 0 ? _payload$nonce : 0,
976
887
  from: payload.from,
977
- gasPrice: (0, _utils4.anyNumberToBN)(payload.gasPrice).toNumber(),
978
- maxFeePerGas: (0, _utils4.anyNumberToBN)(payload.maxFeePerGas).toNumber(),
979
- maxPriorityFeePerGas: (0, _utils4.anyNumberToBN)(payload.maxPriorityFeePerGas).toNumber(),
980
- gasLimit: (0, _utils4.anyNumberToBN)(payload.gas).toNumber(),
888
+ gasPrice: (0, _utils3.anyNumberToBN)(payload.gasPrice).toNumber(),
889
+ maxFeePerGas: (0, _utils3.anyNumberToBN)(payload.maxFeePerGas).toNumber(),
890
+ maxPriorityFeePerGas: (0, _utils3.anyNumberToBN)(payload.maxPriorityFeePerGas).toNumber(),
891
+ gasLimit: (0, _utils3.anyNumberToBN)(payload.gas).toNumber(),
981
892
  to: payload.to,
982
- value: (0, _utils4.anyNumberToBN)(payload.value).toNumber(),
893
+ value: (0, _utils3.anyNumberToBN)(payload.value).toNumber(),
983
894
  data: payload.data,
984
895
  chainId: payload.chainId
985
896
  };
@@ -0,0 +1,10 @@
1
+ import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
2
+ export declare function _handleDisplayForEarningError(error: TransactionError): {
3
+ title: string;
4
+ message: string;
5
+ } | undefined;
6
+ export declare const INSUFFICIENT_MESSAGES: string[];
7
+ export declare function _handleDisplayInsufficientEarningError(error: Error, availableBalance: string, amount: string, minJoinPool: string): {
8
+ title: string;
9
+ message: string;
10
+ } | undefined;
@@ -0,0 +1,37 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import BigN from 'bignumber.js';
5
+ export function _handleDisplayForEarningError(error) {
6
+ if (error.message.startsWith('UnknownError Connection to Indexed DataBase server lost') || error.message.startsWith('Provided address is invalid, the capitalization checksum test failed') || error.message.startsWith('connection not open on send()')) {
7
+ return {
8
+ title: 'Connection error',
9
+ message: 'Your selected network has lost connection. Update it by re-enabling it or changing network provider'
10
+ };
11
+ }
12
+ return undefined;
13
+ }
14
+ export const INSUFFICIENT_MESSAGES = ['残高不足', 'Недостаточный баланс', 'Insufficient balance'];
15
+ export function _handleDisplayInsufficientEarningError(error, availableBalance, amount, minJoinPool) {
16
+ if (!INSUFFICIENT_MESSAGES.some(v => error.message.includes(v))) {
17
+ return undefined;
18
+ }
19
+ const bnAvailableBalance = new BigN(availableBalance);
20
+ const bnAmount = new BigN(amount);
21
+ if (bnAvailableBalance.gt(0) && bnAmount.gte(bnAvailableBalance)) {
22
+ return {
23
+ title: 'Insufficient balance',
24
+ message: 'Insufficient balance. Amount must be smaller than available balance'
25
+ };
26
+ }
27
+ if (bnAvailableBalance.lte(minJoinPool)) {
28
+ return {
29
+ title: 'Insufficient balance',
30
+ message: 'You don\'t have enough {{symbol}} ({{chain}}) to stake, make sure your available balance is higher than {{minJoinPool}} {{symbol}}'
31
+ };
32
+ }
33
+ return {
34
+ title: 'Insufficient balance',
35
+ message: 'You don\'t have enough {{symbol}} ({{chain}}) to pay gas fee. Lower your amount and try again'
36
+ };
37
+ }
@@ -0,0 +1,8 @@
1
+ import { _ChainAsset, _ChainInfo } from '@subwallet/chain-list/types';
2
+ import { SwapError } from '@subwallet/extension-base/background/errors/SwapError';
3
+ import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
4
+ import { ChainflipPreValidationMetadata, HydradxPreValidationMetadata, SwapErrorType } from '@subwallet/extension-base/types/swap';
5
+ export declare function _validateBalanceToSwap(fromToken: _ChainAsset, feeToken: _ChainAsset, feeTokenChainInfo: _ChainInfo, feeAmount: string, fromTokenBalance: string, feeTokenBalance: string, swapAmount: string, isXcmOk: boolean, minSwap?: string): TransactionError | undefined;
6
+ export declare function _validateSwapRecipient(destChainInfo: _ChainInfo, recipient: string): TransactionError | undefined;
7
+ export declare function _getChainflipEarlyValidationError(error: SwapErrorType, metadata: ChainflipPreValidationMetadata): SwapError;
8
+ export declare function _getEarlyHydradxValidationError(error: SwapErrorType, metadata: HydradxPreValidationMetadata): SwapError;