@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
@@ -487,6 +487,7 @@ export interface BasicTokenInfo {
487
487
  }
488
488
  export interface AmountData extends BasicTokenInfo {
489
489
  value: string;
490
+ metadata?: unknown;
490
491
  }
491
492
  export interface FeeData extends AmountData {
492
493
  tooHigh?: boolean;
@@ -926,6 +927,7 @@ export interface RequestFreeBalance {
926
927
  address: string;
927
928
  networkKey: string;
928
929
  token?: string;
930
+ extrinsicType?: ExtrinsicType;
929
931
  }
930
932
  export interface RequestMaxTransferable {
931
933
  address: string;
@@ -1669,6 +1671,8 @@ export interface ResponseSubscribeHistory {
1669
1671
  id: string;
1670
1672
  items: TransactionHistoryItem[];
1671
1673
  }
1674
+ export declare type _Address = string;
1675
+ export declare type _BalanceMetadata = unknown;
1672
1676
  export interface KoniRequestSignatures {
1673
1677
  'pri(staking.submitTuringCancelCompound)': [RequestTuringCancelStakeCompound, SWTransactionResponse];
1674
1678
  'pri(staking.submitTuringCompound)': [RequestTuringStakeCompound, SWTransactionResponse];
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.INSUFFICIENT_MESSAGES = void 0;
8
+ exports._handleDisplayForEarningError = _handleDisplayForEarningError;
9
+ exports._handleDisplayInsufficientEarningError = _handleDisplayInsufficientEarningError;
10
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
11
+ // Copyright 2019-2022 @subwallet/extension-base
12
+ // SPDX-License-Identifier: Apache-2.0
13
+
14
+ function _handleDisplayForEarningError(error) {
15
+ 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()')) {
16
+ return {
17
+ title: 'Connection error',
18
+ message: 'Your selected network has lost connection. Update it by re-enabling it or changing network provider'
19
+ };
20
+ }
21
+ return undefined;
22
+ }
23
+ const INSUFFICIENT_MESSAGES = ['残高不足', 'Недостаточный баланс', 'Insufficient balance'];
24
+ exports.INSUFFICIENT_MESSAGES = INSUFFICIENT_MESSAGES;
25
+ function _handleDisplayInsufficientEarningError(error, availableBalance, amount, minJoinPool) {
26
+ if (!INSUFFICIENT_MESSAGES.some(v => error.message.includes(v))) {
27
+ return undefined;
28
+ }
29
+ const bnAvailableBalance = new _bignumber.default(availableBalance);
30
+ const bnAmount = new _bignumber.default(amount);
31
+ if (bnAvailableBalance.gt(0) && bnAmount.gte(bnAvailableBalance)) {
32
+ return {
33
+ title: 'Insufficient balance',
34
+ message: 'Insufficient balance. Amount must be smaller than available balance'
35
+ };
36
+ }
37
+ if (bnAvailableBalance.lte(minJoinPool)) {
38
+ return {
39
+ title: 'Insufficient balance',
40
+ message: 'You don\'t have enough {{symbol}} ({{chain}}) to stake, make sure your available balance is higher than {{minJoinPool}} {{symbol}}'
41
+ };
42
+ }
43
+ return {
44
+ title: 'Insufficient balance',
45
+ message: 'You don\'t have enough {{symbol}} ({{chain}}) to pay gas fee. Lower your amount and try again'
46
+ };
47
+ }
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports._getChainflipEarlyValidationError = _getChainflipEarlyValidationError;
8
+ exports._getEarlyHydradxValidationError = _getEarlyHydradxValidationError;
9
+ exports._validateBalanceToSwap = _validateBalanceToSwap;
10
+ exports._validateSwapRecipient = _validateSwapRecipient;
11
+ var _SwapError = require("@subwallet/extension-base/background/errors/SwapError");
12
+ var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
13
+ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
14
+ var _utils = require("@subwallet/extension-base/services/chain-service/utils");
15
+ var _swap = require("@subwallet/extension-base/types/swap");
16
+ var _utils2 = require("@subwallet/extension-base/utils");
17
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
18
+ var _utilCrypto = require("@polkadot/util-crypto");
19
+ // Copyright 2019-2022 @subwallet/extension-base
20
+ // SPDX-License-Identifier: Apache-2.0
21
+
22
+ function _validateBalanceToSwap(fromToken, feeToken, feeTokenChainInfo, feeAmount, fromTokenBalance, feeTokenBalance, swapAmount, isXcmOk, minSwap) {
23
+ if (new _bignumber.default(feeTokenBalance).lte(feeAmount)) {
24
+ return new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_BALANCE, `You don't have enough ${feeToken.symbol} (${feeTokenChainInfo.name}) to pay transaction fee`);
25
+ }
26
+ if (fromToken.slug === feeToken.slug) {
27
+ if (new _bignumber.default(fromTokenBalance).lte(new _bignumber.default(feeAmount).plus(swapAmount))) {
28
+ return new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_BALANCE, `Insufficient balance. Deposit ${fromToken.symbol} and try again.`);
29
+ }
30
+ }
31
+ if (isXcmOk) {
32
+ // assume that the swap is valid if XCM is in the process and it was successful
33
+ return undefined;
34
+ }
35
+ if (minSwap) {
36
+ if (new _bignumber.default(fromTokenBalance).lte(minSwap)) {
37
+ const parsedMinSwapValue = (0, _utils2.formatNumber)(minSwap, (0, _utils._getAssetDecimals)(fromToken));
38
+ return new _TransactionError.TransactionError(_swap.SwapErrorType.SWAP_NOT_ENOUGH_BALANCE, `Insufficient balance. You need more than ${parsedMinSwapValue} ${fromToken.symbol} to start swapping. Deposit ${fromToken.symbol} and try again.`); // todo: min swap or amount?
39
+ }
40
+ }
41
+
42
+ if (new _bignumber.default(swapAmount).gte(fromTokenBalance)) {
43
+ const parsedMaxBalanceSwap = (0, _utils2.formatNumber)(fromTokenBalance, (0, _utils._getAssetDecimals)(fromToken));
44
+ return new _TransactionError.TransactionError(_swap.SwapErrorType.SWAP_EXCEED_ALLOWANCE, `Amount too high. Lower your amount ${new _bignumber.default(fromTokenBalance).gt(0) ? `below ${parsedMaxBalanceSwap} ${fromToken.symbol}` : ''} and try again`);
45
+ }
46
+ return undefined;
47
+ }
48
+ function _validateSwapRecipient(destChainInfo, recipient) {
49
+ const isEvmAddress = (0, _utilCrypto.isEthereumAddress)(recipient);
50
+ const isEvmDestChain = (0, _utils._isChainEvmCompatible)(destChainInfo);
51
+ if (isEvmAddress && !isEvmDestChain || !isEvmAddress && isEvmDestChain) {
52
+ return new _TransactionError.TransactionError(_swap.SwapErrorType.INVALID_RECIPIENT);
53
+ }
54
+ return undefined;
55
+ }
56
+ function _getChainflipEarlyValidationError(error, metadata) {
57
+ // todo: support more providers
58
+ switch (error) {
59
+ case _swap.SwapErrorType.NOT_MEET_MIN_SWAP:
60
+ {
61
+ const parsedMinSwapValue = (0, _utils2.formatNumber)(metadata.minSwap.value, metadata.minSwap.decimals);
62
+ const message = `Amount too low. Increase your amount above ${parsedMinSwapValue} ${metadata.minSwap.symbol} and try again`;
63
+ return new _SwapError.SwapError(error, message);
64
+ }
65
+ case _swap.SwapErrorType.SWAP_EXCEED_ALLOWANCE:
66
+ {
67
+ if (metadata.maxSwap) {
68
+ const parsedMaxSwapValue = (0, _utils2.formatNumber)(metadata.maxSwap.value, metadata.maxSwap.decimals);
69
+ return new _SwapError.SwapError(error, `Amount too high. Lower your amount below ${parsedMaxSwapValue} ${metadata.maxSwap.symbol} and try again`);
70
+ } else {
71
+ return new _SwapError.SwapError(error, 'Amount too high. Lower your amount and try again');
72
+ }
73
+ }
74
+ case _swap.SwapErrorType.ASSET_NOT_SUPPORTED:
75
+ return new _SwapError.SwapError(error, 'This swap pair is not supported');
76
+ case _swap.SwapErrorType.UNKNOWN:
77
+ return new _SwapError.SwapError(error, `Undefined error. Check your Internet and ${metadata.chain.slug} connection or contact support`);
78
+ case _swap.SwapErrorType.ERROR_FETCHING_QUOTE:
79
+ return new _SwapError.SwapError(error, 'No swap quote found. Adjust your amount or try again later.');
80
+ default:
81
+ return new _SwapError.SwapError(error);
82
+ }
83
+ }
84
+ function _getEarlyHydradxValidationError(error, metadata) {
85
+ switch (error) {
86
+ case _swap.SwapErrorType.AMOUNT_CANNOT_BE_ZERO:
87
+ {
88
+ return new _SwapError.SwapError(error, 'Amount too low. Increase your amount above 0 and try again');
89
+ }
90
+ case _swap.SwapErrorType.ASSET_NOT_SUPPORTED:
91
+ return new _SwapError.SwapError(error, 'This swap pair is not supported');
92
+ case _swap.SwapErrorType.UNKNOWN:
93
+ return new _SwapError.SwapError(error, `Undefined error. Check your Internet and ${metadata.chain.slug} connection or contact support`);
94
+ case _swap.SwapErrorType.ERROR_FETCHING_QUOTE:
95
+ return new _SwapError.SwapError(error, 'No swap quote found. Adjust your amount or try again later.');
96
+ default:
97
+ return new _SwapError.SwapError(error);
98
+ }
99
+ }
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.additionalValidateTransfer = additionalValidateTransfer;
8
+ exports.additionalValidateXcmTransfer = additionalValidateXcmTransfer;
9
+ exports.checkBalanceWithTransactionFee = checkBalanceWithTransactionFee;
10
+ exports.checkSigningAccountForTransaction = checkSigningAccountForTransaction;
11
+ exports.checkSupportForTransaction = checkSupportForTransaction;
12
+ exports.estimateFeeForTransaction = estimateFeeForTransaction;
13
+ exports.validateTransferRequest = validateTransferRequest;
14
+ exports.validateXcmTransferRequest = validateXcmTransferRequest;
15
+ var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
16
+ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
17
+ var _TransactionWarning = require("@subwallet/extension-base/background/warnings/TransactionWarning");
18
+ var _constants = require("@subwallet/extension-base/constants");
19
+ var _systemPallet = require("@subwallet/extension-base/core/substrate/system-pallet");
20
+ var _constants2 = require("@subwallet/extension-base/services/chain-service/constants");
21
+ var _utils = require("@subwallet/extension-base/services/chain-service/utils");
22
+ var _utils2 = require("@subwallet/extension-base/services/fee-service/utils");
23
+ var _helpers = require("@subwallet/extension-base/services/transaction-service/helpers");
24
+ var _utils3 = require("@subwallet/extension-base/utils");
25
+ var _uiKeyring = require("@subwallet/ui-keyring");
26
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
27
+ var _i18next = require("i18next");
28
+ var _utilCrypto = require("@polkadot/util-crypto");
29
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
30
+ // SPDX-License-Identifier: Apache-2.0
31
+
32
+ // normal transfer
33
+ function validateTransferRequest(tokenInfo, from, to, value, transferAll) {
34
+ const errors = [];
35
+ const keypair = _uiKeyring.keyring.getPair(from);
36
+ let transferValue;
37
+ if (!transferAll) {
38
+ if (value === undefined) {
39
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)('Transfer amount is required')));
40
+ }
41
+ if (value) {
42
+ transferValue = new _bignumber.default(value);
43
+ }
44
+ }
45
+ if (!tokenInfo) {
46
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)('Not found token from registry')));
47
+ }
48
+ if ((0, _utilCrypto.isEthereumAddress)(from) && (0, _utilCrypto.isEthereumAddress)(to) && (0, _utils._isTokenEvmSmartContract)(tokenInfo) && (0, _utils._getContractAddressOfToken)(tokenInfo).length === 0) {
49
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)('Not found ERC20 address for this token')));
50
+ }
51
+ return [errors, keypair, transferValue];
52
+ }
53
+ function additionalValidateTransfer(tokenInfo, extrinsicType, receiverTransferTokenFreeBalance, transferAmount, senderTransferTokenTransferable) {
54
+ const minAmount = (0, _utils._getTokenMinAmount)(tokenInfo);
55
+ let warning;
56
+ let error;
57
+
58
+ // Check ed of not native token for sender
59
+ if (extrinsicType === _KoniTypes.ExtrinsicType.TRANSFER_TOKEN && senderTransferTokenTransferable) {
60
+ if (new _bignumber.default(senderTransferTokenTransferable).minus(transferAmount).lt(minAmount)) {
61
+ warning = new _TransactionWarning.TransactionWarning(_KoniTypes.BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT);
62
+ }
63
+ }
64
+
65
+ // Check ed for receiver
66
+ if (new _bignumber.default(receiverTransferTokenFreeBalance).plus(transferAmount).lt(minAmount)) {
67
+ const atLeast = new _bignumber.default(minAmount).minus(receiverTransferTokenFreeBalance).plus((tokenInfo.decimals || 0) === 0 ? 0 : 1);
68
+ const atLeastStr = (0, _utils3.formatNumber)(atLeast, tokenInfo.decimals || 0, _utils3.balanceFormatter, {
69
+ maxNumberFormat: tokenInfo.decimals || 6
70
+ });
71
+ error = new _TransactionError.TransactionError(_KoniTypes.TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, (0, _i18next.t)('You must transfer at least {{amount}} {{symbol}} to keep the destination account alive', {
72
+ replace: {
73
+ amount: atLeastStr,
74
+ symbol: tokenInfo.symbol
75
+ }
76
+ }));
77
+ }
78
+ return [warning, error];
79
+ }
80
+
81
+ // xcm transfer
82
+ function validateXcmTransferRequest(destTokenInfo, sender, sendingValue) {
83
+ const errors = [];
84
+ const keypair = _uiKeyring.keyring.getPair(sender);
85
+ const transferValue = new _bignumber.default(sendingValue);
86
+ if (!destTokenInfo) {
87
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.TransferTxErrorType.INVALID_TOKEN, (0, _i18next.t)('Not found token from registry')));
88
+ }
89
+ return [errors, keypair, transferValue];
90
+ }
91
+ function additionalValidateXcmTransfer(originTokenInfo, destinationTokenInfo, sendingAmount, senderTransferable) {
92
+ const destMinAmount = (0, _utils._getTokenMinAmount)(destinationTokenInfo);
93
+ const minSendingRequired = new _bignumber.default(destMinAmount).multipliedBy(_constants.XCM_MIN_AMOUNT_RATIO);
94
+ let error;
95
+ let warning;
96
+
97
+ // Check ed for receiver
98
+ if (new _bignumber.default(sendingAmount).lt(minSendingRequired)) {
99
+ const atLeastStr = (0, _utils3.formatNumber)(minSendingRequired, destinationTokenInfo.decimals || 0, _utils3.balanceFormatter, {
100
+ maxNumberFormat: destinationTokenInfo.decimals || 6
101
+ });
102
+ error = new _TransactionError.TransactionError(_KoniTypes.TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, (0, _i18next.t)('You must transfer at least {{amount}} {{symbol}} to keep the destination account alive', {
103
+ replace: {
104
+ amount: atLeastStr,
105
+ symbol: originTokenInfo.symbol
106
+ }
107
+ }));
108
+ }
109
+
110
+ // Check ed for sender
111
+ if (!(0, _utils._isNativeToken)(originTokenInfo)) {
112
+ if (new _bignumber.default(senderTransferable).minus(sendingAmount).lt((0, _utils._getTokenMinAmount)(originTokenInfo))) {
113
+ warning = new _TransactionWarning.TransactionWarning(_KoniTypes.BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT);
114
+ }
115
+ }
116
+ return [warning, error];
117
+ }
118
+
119
+ // general validations
120
+ function checkSupportForTransaction(validationResponse, transaction) {
121
+ const {
122
+ extrinsicType
123
+ } = validationResponse;
124
+ if (!transaction) {
125
+ if (extrinsicType === _KoniTypes.ExtrinsicType.SEND_NFT) {
126
+ validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.UNSUPPORTED, (0, _i18next.t)('This feature is not yet available for this NFT')));
127
+ } else {
128
+ validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.UNSUPPORTED));
129
+ }
130
+ }
131
+ }
132
+ async function estimateFeeForTransaction(validationResponse, transaction, chainInfo, evmApi) {
133
+ const estimateFee = {
134
+ symbol: '',
135
+ decimals: 0,
136
+ value: '0',
137
+ tooHigh: false
138
+ };
139
+ const {
140
+ decimals,
141
+ symbol
142
+ } = (0, _utils._getChainNativeTokenBasicInfo)(chainInfo);
143
+ estimateFee.decimals = decimals;
144
+ estimateFee.symbol = symbol;
145
+ if (transaction) {
146
+ try {
147
+ if ((0, _helpers.isSubstrateTransaction)(transaction)) {
148
+ estimateFee.value = (await transaction.paymentInfo(validationResponse.address)).partialFee.toString();
149
+ } else {
150
+ const gasLimit = await evmApi.api.eth.estimateGas(transaction);
151
+ const priority = await (0, _utils2.calculateGasFeeParams)(evmApi, chainInfo.slug);
152
+ if (priority.baseGasFee) {
153
+ const maxFee = priority.maxFeePerGas; // TODO: Need review
154
+
155
+ estimateFee.value = maxFee.multipliedBy(gasLimit).toFixed(0);
156
+ } else {
157
+ estimateFee.value = new _bignumber.default(priority.gasPrice).multipliedBy(gasLimit).toFixed(0);
158
+ }
159
+ estimateFee.tooHigh = priority.busyNetwork;
160
+ }
161
+ } catch (e) {
162
+ const error = e;
163
+ if (error.message.includes('gas required exceeds allowance') && error.message.includes('insufficient funds')) {
164
+ validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_BALANCE));
165
+ }
166
+ }
167
+ }
168
+ return estimateFee;
169
+ }
170
+ function checkSigningAccountForTransaction(validationResponse) {
171
+ const pair = _uiKeyring.keyring.getPair(validationResponse.address);
172
+ if (!pair) {
173
+ validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR, (0, _i18next.t)('Unable to find account')));
174
+ } else {
175
+ var _pair$meta;
176
+ if ((_pair$meta = pair.meta) !== null && _pair$meta !== void 0 && _pair$meta.isReadOnly) {
177
+ validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR, (0, _i18next.t)('This account is watch-only')));
178
+ }
179
+ }
180
+ }
181
+ function checkBalanceWithTransactionFee(validationResponse, transactionInput, nativeTokenInfo, nativeTokenAvailable) {
182
+ if (!validationResponse.estimateFee) {
183
+ // todo: estimateFee should be must-have, need to refactor interface
184
+ return;
185
+ }
186
+
187
+ // if (!nativeTokenAvailable.metadata) {
188
+ // validationResponse.errors.push(new TransactionError(BasicTxErrorType.INTERNAL_ERROR));
189
+ //
190
+ // return;
191
+ // }
192
+
193
+ const {
194
+ edAsWarning,
195
+ extrinsicType,
196
+ isTransferAll,
197
+ skipFeeValidation
198
+ } = transactionInput;
199
+ if (skipFeeValidation) {
200
+ return;
201
+ }
202
+ const bnFee = new _bignumber.default(validationResponse.estimateFee.value);
203
+ const bnNativeTokenAvailable = new _bignumber.default(nativeTokenAvailable.value);
204
+ const bnNativeTokenTransferAmount = new _bignumber.default(validationResponse.transferNativeAmount || '0');
205
+ if (!bnNativeTokenAvailable.gt(0)) {
206
+ validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_BALANCE));
207
+ }
208
+ const isChainNotSupportTransferAll = [..._constants2._TRANSFER_CHAIN_GROUP.acala, ..._constants2._TRANSFER_CHAIN_GROUP.genshiro, ..._constants2._TRANSFER_CHAIN_GROUP.bitcountry, ..._constants2._TRANSFER_CHAIN_GROUP.statemine].includes(nativeTokenInfo.originChain);
209
+ if (bnNativeTokenTransferAmount.plus(bnFee).gt(bnNativeTokenAvailable) && (!isTransferAll || isChainNotSupportTransferAll)) {
210
+ validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_BALANCE)); // todo: should be generalized and reused in all features
211
+ }
212
+
213
+ // todo: only system.pallet has metadata, we should add for other pallets and mechanisms as well
214
+ const isNeedCheckRemainingBalance = !isTransferAll && extrinsicType === _KoniTypes.ExtrinsicType.TRANSFER_BALANCE && nativeTokenAvailable.metadata && (0, _systemPallet._canAccountBeReaped)(nativeTokenAvailable.metadata);
215
+ const isRemainingBalanceValid = bnNativeTokenAvailable.minus(bnNativeTokenTransferAmount).minus(bnFee).lt((0, _utils._getTokenMinAmount)(nativeTokenInfo));
216
+ if (isNeedCheckRemainingBalance && isRemainingBalanceValid) {
217
+ edAsWarning ? validationResponse.warnings.push(new _TransactionWarning.TransactionWarning(_KoniTypes.BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT)) : validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.NOT_ENOUGH_EXISTENTIAL_DEPOSIT));
218
+ }
219
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports._getActiveStakeInNominationPool = _getActiveStakeInNominationPool;
7
+ // Copyright 2019-2022 @subwallet/extension-base
8
+ // SPDX-License-Identifier: Apache-2.0
9
+
10
+ function _getActiveStakeInNominationPool(memberInfo) {
11
+ return memberInfo.points.toString();
12
+ }
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports._canAccountBeReaped = _canAccountBeReaped;
8
+ exports._getAppliedExistentialDepositWithExtrinsicType = _getAppliedExistentialDepositWithExtrinsicType;
9
+ exports._getSystemPalletTotalBalance = _getSystemPalletTotalBalance;
10
+ exports._getSystemPalletTransferable = _getSystemPalletTransferable;
11
+ exports._isAccountActive = _isAccountActive;
12
+ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
13
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
14
+ // Copyright 2019-2022 @subwallet/extension-base
15
+ // SPDX-License-Identifier: Apache-2.0
16
+
17
+ function isV1(accountInfo) {
18
+ return accountInfo.data.miscFrozen !== undefined && accountInfo.data.feeFrozen !== undefined;
19
+ }
20
+ function _getSystemPalletTransferable(accountInfo, existentialDeposit, extrinsicType) {
21
+ const strictMode = !extrinsicType || ![_KoniTypes.ExtrinsicType.TRANSFER_BALANCE].includes(extrinsicType); // always apply strict mode to keep account alive unless explicitly specified otherwise
22
+
23
+ if (isV1(accountInfo)) {
24
+ return _getSystemPalletTransferableV1(accountInfo, existentialDeposit, strictMode);
25
+ } else {
26
+ return _getSystemPalletTransferableV2(accountInfo, existentialDeposit, strictMode);
27
+ }
28
+ }
29
+ function _canAccountBeReaped(accountInfo) {
30
+ return accountInfo.consumers === 0; // might need to check refCount
31
+ }
32
+
33
+ function _isAccountActive(accountInfo) {
34
+ return accountInfo.providers === 0 && accountInfo.consumers === 0;
35
+ }
36
+ function _getSystemPalletTotalBalance(accountInfo) {
37
+ if (isV1(accountInfo)) {
38
+ return _getSystemPalletTotalBalanceV1(accountInfo);
39
+ } else {
40
+ return _getSystemPalletTotalBalanceV2(accountInfo);
41
+ }
42
+ }
43
+ function _getAppliedExistentialDepositWithExtrinsicType(accountInfo, existentialDeposit, extrinsicType) {
44
+ const strictMode = !extrinsicType || ![_KoniTypes.ExtrinsicType.TRANSFER_BALANCE].includes(extrinsicType); // always apply strict mode to keep account alive unless explicitly specified otherwise
45
+
46
+ return _getAppliedExistentialDeposit(accountInfo, existentialDeposit, strictMode);
47
+ }
48
+
49
+ // ----------------------------------------------------------------------
50
+
51
+ function _getAppliedExistentialDeposit(accountInfo, existentialDeposit, strictMode) {
52
+ // strict mode will always apply existential deposit to keep account alive
53
+ if (strictMode) {
54
+ return existentialDeposit;
55
+ }
56
+ return _canAccountBeReaped(accountInfo) ? '0' : existentialDeposit; // account for ED here will go better with max transfer logic
57
+ }
58
+
59
+ function _getSystemPalletTransferableV2(accountInfo, existentialDeposit, strictMode) {
60
+ const bnFree = new _bignumber.default(accountInfo.data.free);
61
+ const bnLocked = new _bignumber.default(accountInfo.data.frozen).minus(accountInfo.data.reserved); // locked can go below 0 but this shouldn't matter
62
+ const bnAppliedExistentialDeposit = new _bignumber.default(_getAppliedExistentialDeposit(accountInfo, existentialDeposit, strictMode));
63
+ const bnTransferableBalance = bnFree.minus(_bignumber.default.max(bnLocked, bnAppliedExistentialDeposit));
64
+ return _bignumber.default.max(bnTransferableBalance, 0).toFixed();
65
+ }
66
+ function _getSystemPalletTotalBalanceV2(accountInfo) {
67
+ return new _bignumber.default(accountInfo.data.free).plus(accountInfo.data.reserved).toFixed();
68
+ }
69
+ function _getSystemPalletTransferableV1(accountInfo, existentialDeposit, strictMode) {
70
+ const bnAppliedExistentialDeposit = new _bignumber.default(_getAppliedExistentialDeposit(accountInfo, existentialDeposit, strictMode));
71
+ const bnAppliedFrozen = _bignumber.default.max(accountInfo.data.feeFrozen, accountInfo.data.miscFrozen);
72
+ const bnTotalBalance = new _bignumber.default(_getSystemPalletTotalBalanceV1(accountInfo));
73
+ const bnTransferableBalance = bnTotalBalance.minus(_bignumber.default.max(bnAppliedFrozen, accountInfo.data.reserved, bnAppliedExistentialDeposit));
74
+ return _bignumber.default.max(bnTransferableBalance, 0).toFixed();
75
+ }
76
+ function _getSystemPalletTotalBalanceV1(accountInfo) {
77
+ return new _bignumber.default(accountInfo.data.free).toFixed();
78
+ }
@@ -1,17 +1,20 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.checkReferenceCount = checkReferenceCount;
7
8
  exports.checkSupportTransfer = checkSupportTransfer;
8
- exports.createTransferExtrinsic = void 0;
9
+ exports.getTransferMockTxFee = exports.createTransferExtrinsic = void 0;
9
10
  var _api = require("@gear-js/api");
10
11
  var _wasm = require("@subwallet/extension-base/koni/api/tokens/wasm");
11
12
  var _utils = require("@subwallet/extension-base/koni/api/tokens/wasm/utils");
12
13
  var _constants = require("@subwallet/extension-base/services/chain-service/constants");
13
14
  var _utils2 = require("@subwallet/extension-base/services/chain-service/utils");
14
- var _utils3 = require("@subwallet/extension-base/utils");
15
+ var _utils3 = require("@subwallet/extension-base/services/fee-service/utils");
16
+ var _utils4 = require("@subwallet/extension-base/utils");
17
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
15
18
  var _util = require("@polkadot/util");
16
19
  var _utilCrypto = require("@polkadot/util-crypto");
17
20
  // Copyright 2019-2022 @subwallet/extension-base
@@ -153,7 +156,7 @@ const createTransferExtrinsic = async _ref => {
153
156
  }, to, value, {});
154
157
  transferAmount = value;
155
158
  } else if ((0, _utils2._isTokenGearSmartContract)(tokenInfo) && api instanceof _api.GearApi) {
156
- const contractPromise = (0, _utils3.getGRC20ContractPromise)(api, (0, _utils2._getContractAddressOfToken)(tokenInfo));
159
+ const contractPromise = (0, _utils4.getGRC20ContractPromise)(api, (0, _utils2._getContractAddressOfToken)(tokenInfo));
157
160
  const transaction = await contractPromise.transfer((0, _util.u8aToHex)((0, _utilCrypto.decodeAddress)(to)), BigInt(value)) // Create transfer transaction
158
161
  .withAccount(from) // Set sender account
159
162
  .calculateGas(); // Add account arg to extrinsic
@@ -221,4 +224,46 @@ const createTransferExtrinsic = async _ref => {
221
224
  }
222
225
  return [transfer, transferAmount || value];
223
226
  };
224
- exports.createTransferExtrinsic = createTransferExtrinsic;
227
+ exports.createTransferExtrinsic = createTransferExtrinsic;
228
+ const getTransferMockTxFee = async (address, chainInfo, tokenInfo, api) => {
229
+ try {
230
+ let estimatedFee;
231
+ if ((0, _utils2._isChainEvmCompatible)(chainInfo) && (0, _utils2._isTokenTransferredByEvm)(tokenInfo)) {
232
+ const web3 = api;
233
+ const transaction = {
234
+ value: 0,
235
+ to: '0x0000000000000000000000000000000000000000',
236
+ // null address
237
+ from: address
238
+ };
239
+ const gasLimit = await web3.api.eth.estimateGas(transaction);
240
+ const priority = await (0, _utils3.calculateGasFeeParams)(web3, chainInfo.slug);
241
+ if (priority.baseGasFee) {
242
+ const maxFee = priority.maxFeePerGas;
243
+ estimatedFee = maxFee.multipliedBy(gasLimit);
244
+ } else {
245
+ estimatedFee = new _bignumber.default(priority.gasPrice).multipliedBy(gasLimit);
246
+ }
247
+ } else {
248
+ var _paymentInfo$partialF;
249
+ const substrateApi = api;
250
+ const [mockTx] = await createTransferExtrinsic({
251
+ from: address,
252
+ networkKey: chainInfo.slug,
253
+ substrateApi,
254
+ to: address,
255
+ tokenInfo,
256
+ transferAll: true,
257
+ value: '1000000000000000000'
258
+ });
259
+ const paymentInfo = await (mockTx === null || mockTx === void 0 ? void 0 : mockTx.paymentInfo(address));
260
+ estimatedFee = new _bignumber.default((paymentInfo === null || paymentInfo === void 0 ? void 0 : (_paymentInfo$partialF = paymentInfo.partialFee) === null || _paymentInfo$partialF === void 0 ? void 0 : _paymentInfo$partialF.toString()) || '0'); // todo: should handle error case instead of setting fee to 0
261
+ }
262
+
263
+ return estimatedFee;
264
+ } catch (e) {
265
+ console.error('error mocking tx fee', e);
266
+ return new _bignumber.default(0);
267
+ }
268
+ };
269
+ exports.getTransferMockTxFee = getTransferMockTxFee;
@@ -423,7 +423,7 @@ function getTopValidatorByPoints(validatorPointsList) {
423
423
  const getMinStakeErrorMessage = (chainInfo, bnMinStake) => {
424
424
  const tokenInfo = (0, _utils._getChainNativeTokenBasicInfo)(chainInfo);
425
425
  const number = (0, _number.formatNumber)(bnMinStake.toString(), tokenInfo.decimals || 0, _number.balanceFormatter);
426
- return (0, _i18next.t)('Insufficient stake. Please stake at least {{number}} {{tokenSymbol}} to get rewards', {
426
+ return (0, _i18next.t)('Insufficient stake. You need to stake at least {{number}} {{tokenSymbol}} to earn rewards', {
427
427
  replace: {
428
428
  tokenSymbol: tokenInfo.symbol,
429
429
  number
@@ -1,14 +1,18 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
- exports.createXcmExtrinsic = void 0;
7
+ exports.getXcmMockTxFee = exports.createXcmExtrinsic = void 0;
7
8
  var _polkadotXcm = require("@subwallet/extension-base/koni/api/xcm/polkadotXcm");
8
9
  var _xcmPallet = require("@subwallet/extension-base/koni/api/xcm/xcmPallet");
9
10
  var _xTokens = require("@subwallet/extension-base/koni/api/xcm/xTokens");
10
11
  var _constants = require("@subwallet/extension-base/services/chain-service/constants");
11
12
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
13
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
14
+ var _util = require("@polkadot/util");
15
+ var _utilCrypto = require("@polkadot/util-crypto");
12
16
  // Copyright 2019-2022 @subwallet/extension-base
13
17
  // SPDX-License-Identifier: Apache-2.0
14
18
 
@@ -39,4 +43,28 @@ const createXcmExtrinsic = async _ref => {
39
43
  }
40
44
  return extrinsic;
41
45
  };
42
- exports.createXcmExtrinsic = createXcmExtrinsic;
46
+ exports.createXcmExtrinsic = createXcmExtrinsic;
47
+ const getXcmMockTxFee = async (substrateApi, chainInfoMap, address, originTokenInfo, destinationTokenInfo) => {
48
+ try {
49
+ var _paymentInfo$partialF;
50
+ const destChainInfo = chainInfoMap[destinationTokenInfo.originChain];
51
+ const originChainInfo = chainInfoMap[originTokenInfo.originChain];
52
+
53
+ // mock receiving account from sender
54
+ const recipient = !(0, _utilCrypto.isEthereumAddress)(address) && (0, _utils._isChainEvmCompatible)(destChainInfo) && !(0, _utils._isChainEvmCompatible)(originChainInfo) ? (0, _util.u8aToHex)((0, _utilCrypto.addressToEvm)(address)) : address;
55
+ const mockTx = await createXcmExtrinsic({
56
+ chainInfoMap,
57
+ destinationTokenInfo,
58
+ originTokenInfo,
59
+ recipient: recipient,
60
+ sendingValue: '1000000000000000000',
61
+ substrateApi
62
+ });
63
+ const paymentInfo = await mockTx.paymentInfo(address);
64
+ return new _bignumber.default((paymentInfo === null || paymentInfo === void 0 ? void 0 : (_paymentInfo$partialF = paymentInfo.partialFee) === null || _paymentInfo$partialF === void 0 ? void 0 : _paymentInfo$partialF.toString()) || '0');
65
+ } catch (e) {
66
+ console.error('error mocking xcm tx fee', e);
67
+ return new _bignumber.default(0);
68
+ }
69
+ };
70
+ exports.getXcmMockTxFee = getXcmMockTxFee;