@subwallet/extension-base 1.1.31-beta.0 → 1.1.32-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/background/KoniTypes.d.ts +1 -0
  2. package/cjs/koni/api/staking/bonding/index.js +2 -0
  3. package/cjs/koni/api/staking/bonding/paraChain.js +6 -3
  4. package/cjs/koni/background/cron.js +0 -28
  5. package/cjs/koni/background/handlers/Extension.js +17 -11
  6. package/cjs/koni/background/handlers/State.js +4 -46
  7. package/cjs/koni/background/subscription.js +0 -155
  8. package/cjs/packageInfo.js +1 -1
  9. package/cjs/services/campaign-service/index.js +19 -0
  10. package/cjs/services/chain-service/constants.js +3 -2
  11. package/cjs/services/earning-service/constants/chains.js +1 -1
  12. package/cjs/services/earning-service/handlers/base.js +9 -6
  13. package/cjs/services/earning-service/handlers/lending/base.js +61 -0
  14. package/cjs/services/earning-service/handlers/lending/interlay.js +3 -2
  15. package/cjs/services/earning-service/handlers/liquid-staking/acala.js +3 -2
  16. package/cjs/services/earning-service/handlers/liquid-staking/base.js +54 -0
  17. package/cjs/services/earning-service/handlers/liquid-staking/bifrost.js +3 -2
  18. package/cjs/services/earning-service/handlers/liquid-staking/parallel.js +3 -2
  19. package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +16 -7
  20. package/cjs/services/earning-service/handlers/native-staking/amplitude.js +7 -2
  21. package/cjs/services/earning-service/handlers/native-staking/astar.js +7 -2
  22. package/cjs/services/earning-service/handlers/native-staking/base.js +4 -2
  23. package/cjs/services/earning-service/handlers/native-staking/para-chain.js +7 -2
  24. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +12 -3
  25. package/cjs/services/earning-service/handlers/nomination-pool/index.js +9 -3
  26. package/cjs/services/earning-service/handlers/special.js +57 -67
  27. package/cjs/services/earning-service/service.js +370 -37
  28. package/cjs/services/event-service/index.js +1 -0
  29. package/cjs/services/migration-service/scripts/index.js +1 -2
  30. package/cjs/services/storage-service/DatabaseService.js +15 -0
  31. package/cjs/services/storage-service/db-stores/Campaign.js +9 -3
  32. package/cjs/services/storage-service/db-stores/YieldPositionStore.js +6 -0
  33. package/cjs/services/transaction-service/index.js +15 -1
  34. package/cjs/utils/number.js +3 -1
  35. package/koni/api/staking/bonding/index.d.ts +1 -0
  36. package/koni/api/staking/bonding/index.js +2 -0
  37. package/koni/api/staking/bonding/paraChain.js +6 -3
  38. package/koni/background/cron.d.ts +0 -5
  39. package/koni/background/cron.js +1 -29
  40. package/koni/background/handlers/Extension.js +17 -11
  41. package/koni/background/handlers/State.d.ts +1 -12
  42. package/koni/background/handlers/State.js +4 -46
  43. package/koni/background/subscription.d.ts +1 -11
  44. package/koni/background/subscription.js +2 -157
  45. package/package.json +6 -6
  46. package/packageInfo.js +1 -1
  47. package/services/campaign-service/index.js +19 -0
  48. package/services/chain-service/constants.js +3 -2
  49. package/services/earning-service/constants/chains.js +1 -1
  50. package/services/earning-service/handlers/base.d.ts +1 -0
  51. package/services/earning-service/handlers/base.js +9 -6
  52. package/services/earning-service/handlers/lending/base.d.ts +2 -0
  53. package/services/earning-service/handlers/lending/base.js +61 -0
  54. package/services/earning-service/handlers/lending/interlay.js +4 -3
  55. package/services/earning-service/handlers/liquid-staking/acala.js +4 -3
  56. package/services/earning-service/handlers/liquid-staking/base.d.ts +2 -0
  57. package/services/earning-service/handlers/liquid-staking/base.js +55 -1
  58. package/services/earning-service/handlers/liquid-staking/bifrost.js +4 -3
  59. package/services/earning-service/handlers/liquid-staking/parallel.js +4 -3
  60. package/services/earning-service/handlers/liquid-staking/stella-swap.js +16 -7
  61. package/services/earning-service/handlers/native-staking/amplitude.js +7 -2
  62. package/services/earning-service/handlers/native-staking/astar.js +7 -2
  63. package/services/earning-service/handlers/native-staking/base.js +5 -3
  64. package/services/earning-service/handlers/native-staking/para-chain.js +7 -2
  65. package/services/earning-service/handlers/native-staking/relay-chain.js +12 -3
  66. package/services/earning-service/handlers/nomination-pool/index.js +10 -4
  67. package/services/earning-service/handlers/special.d.ts +0 -1
  68. package/services/earning-service/handlers/special.js +58 -68
  69. package/services/earning-service/service.d.ts +49 -1
  70. package/services/earning-service/service.js +358 -28
  71. package/services/event-service/index.d.ts +1 -0
  72. package/services/event-service/index.js +1 -0
  73. package/services/event-service/types.d.ts +1 -0
  74. package/services/migration-service/scripts/index.js +1 -2
  75. package/services/storage-service/DatabaseService.d.ts +5 -0
  76. package/services/storage-service/DatabaseService.js +15 -0
  77. package/services/storage-service/db-stores/Campaign.js +9 -3
  78. package/services/storage-service/db-stores/YieldPositionStore.d.ts +2 -0
  79. package/services/storage-service/db-stores/YieldPositionStore.js +6 -0
  80. package/services/transaction-service/index.js +15 -1
  81. package/types/yield/actions/join/submit.d.ts +2 -1
  82. package/types/yield/info/account/reward.d.ts +2 -0
  83. package/utils/number.d.ts +1 -0
  84. package/utils/number.js +1 -0
@@ -5,7 +5,12 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.default = void 0;
8
+ var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
9
+ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
8
10
  var _types = require("@subwallet/extension-base/types");
11
+ var _utils = require("@subwallet/extension-base/utils");
12
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
13
+ var _i18next = require("i18next");
9
14
  var _special = _interopRequireDefault(require("../special"));
10
15
  // Copyright 2019-2022 @subwallet/extension-base
11
16
  // SPDX-License-Identifier: Apache-2.0
@@ -16,5 +21,61 @@ class BaseLendingPoolHandler extends _special.default {
16
21
  /* Subscribe pool info */
17
22
 
18
23
  /* Subscribe pool info */
24
+
25
+ /* Leave pool action */
26
+
27
+ async validateYieldLeave(amount, address, fastLeave, selectedTarget) {
28
+ const poolInfo = await this.getPoolInfo();
29
+ const poolPosition = await this.getPoolPosition(address);
30
+ if (!poolInfo || !poolInfo.statistic || !poolPosition) {
31
+ return [new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR)];
32
+ }
33
+ if (!this.availableMethod.defaultUnstake && !fastLeave) {
34
+ return [new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR)];
35
+ }
36
+ if (!this.availableMethod.fastUnstake && fastLeave) {
37
+ return [new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR)];
38
+ }
39
+ const errors = [];
40
+ const bnActiveStake = new _bignumber.default(poolPosition.activeStake).multipliedBy(poolInfo.statistic.assetEarning[0].exchangeRate || 1);
41
+ const bnAmount = new _bignumber.default(amount);
42
+ const bnRemainingStake = bnActiveStake.minus(bnAmount);
43
+ const minStake = new _bignumber.default(poolInfo.statistic.earningThreshold.join || '0');
44
+ const minUnstake = new _bignumber.default((fastLeave ? poolInfo.statistic.earningThreshold.fastUnstake : poolInfo.statistic.earningThreshold.defaultUnstake) || '0');
45
+ const maxUnstakeRequest = poolInfo.statistic.maxWithdrawalRequestPerFarmer;
46
+ const derivativeTokenInfo = this.state.getAssetBySlug(this.derivativeAssets[0]);
47
+ if (bnAmount.lte(_utils.BN_ZERO)) {
48
+ return [new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)('Amount must be greater than 0'))];
49
+ }
50
+ if (bnAmount.lt(minUnstake)) {
51
+ const minUnstakeStr = (0, _utils.formatNumber)(minUnstake.toString(), derivativeTokenInfo.decimals || 0);
52
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.NOT_ENOUGH_MIN_UNSTAKE, (0, _i18next.t)('You need to unstake at least {{amount}} {{token}}', {
53
+ replace: {
54
+ amount: minUnstakeStr,
55
+ token: derivativeTokenInfo.symbol
56
+ }
57
+ })));
58
+ }
59
+ if (!fastLeave) {
60
+ if (!(bnRemainingStake.isZero() || bnRemainingStake.gte(minStake))) {
61
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.INVALID_ACTIVE_STAKE)); // TODO
62
+ }
63
+
64
+ if (poolPosition.unstakings.length > maxUnstakeRequest) {
65
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.EXCEED_MAX_UNSTAKING, (0, _i18next.t)('You cannot unstake more than {{number}} times', {
66
+ replace: {
67
+ number: maxUnstakeRequest
68
+ }
69
+ })));
70
+ }
71
+ }
72
+ if (bnRemainingStake.lt(0)) {
73
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.INVALID_ACTIVE_STAKE)); // TODO
74
+ }
75
+
76
+ return Promise.resolve(errors);
77
+ }
78
+
79
+ /* Leave pool action */
19
80
  }
20
81
  exports.default = BaseLendingPoolHandler;
@@ -108,7 +108,7 @@ class InterlayLendingPoolHandler extends _base.default {
108
108
  totalStake: bnTotalBalance.toString(),
109
109
  activeStake: bnActiveBalance.toString(),
110
110
  unstakeBalance: '0',
111
- status: _types.EarningStatus.EARNING_REWARD,
111
+ status: bnActiveBalance.gt(_util.BN_ZERO) ? _types.EarningStatus.EARNING_REWARD : _types.EarningStatus.NOT_EARNING,
112
112
  derivativeToken: derivativeTokenSlug,
113
113
  isBondedBefore: bnTotalBalance.gt(_util.BN_ZERO),
114
114
  nominations: [],
@@ -162,7 +162,8 @@ class InterlayLendingPoolHandler extends _base.default {
162
162
  extrinsicType: _KoniTypes.ExtrinsicType.MINT_QDOT,
163
163
  extrinsic,
164
164
  txData: data,
165
- transferNativeAmount: '0'
165
+ transferNativeAmount: '0',
166
+ chainType: _KoniTypes.ChainType.SUBSTRATE
166
167
  };
167
168
  }
168
169
 
@@ -148,7 +148,7 @@ class AcalaLiquidStakingPoolHandler extends _base.default {
148
148
  totalStake: totalBalance.toString(),
149
149
  activeStake: activeTotalBalance.toString(),
150
150
  unstakeBalance: unlockingBalance.toString(),
151
- status: _types.EarningStatus.EARNING_REWARD,
151
+ status: activeTotalBalance.gt(_util.BN_ZERO) ? _types.EarningStatus.EARNING_REWARD : _types.EarningStatus.NOT_EARNING,
152
152
  derivativeToken: derivativeTokenSlug,
153
153
  isBondedBefore: totalBalance.gt(_util.BN_ZERO),
154
154
  nominations: [],
@@ -198,7 +198,8 @@ class AcalaLiquidStakingPoolHandler extends _base.default {
198
198
  extrinsicType: _KoniTypes.ExtrinsicType.MINT_LDOT,
199
199
  extrinsic,
200
200
  txData: data,
201
- transferNativeAmount: '0'
201
+ transferNativeAmount: '0',
202
+ chainType: _KoniTypes.ChainType.SUBSTRATE
202
203
  };
203
204
  }
204
205
 
@@ -9,6 +9,9 @@ var _TransactionError = require("@subwallet/extension-base/background/errors/Tra
9
9
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
10
10
  var _utils = require("@subwallet/extension-base/koni/api/yield/helper/utils");
11
11
  var _types = require("@subwallet/extension-base/types");
12
+ var _utils2 = require("@subwallet/extension-base/utils");
13
+ var _i18next = require("i18next");
14
+ var _util = require("@polkadot/util");
12
15
  var _special = _interopRequireDefault(require("../special"));
13
16
  // Copyright 2019-2022 @subwallet/extension-base
14
17
  // SPDX-License-Identifier: Apache-2.0
@@ -37,6 +40,57 @@ class BaseLiquidStakingPoolHandler extends _special.default {
37
40
  const formattedMinAmount = (0, _utils.convertDerivativeToOriginToken)(amount, poolInfo, derivativeTokenInfo, originTokenInfo);
38
41
  return Math.floor(this.minAmountPercent * formattedMinAmount);
39
42
  }
43
+ async validateYieldLeave(amount, address, fastLeave, selectedTarget) {
44
+ const poolInfo = await this.getPoolInfo();
45
+ const poolPosition = await this.getPoolPosition(address);
46
+ if (!poolInfo || !poolInfo.statistic || !poolPosition) {
47
+ return [new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR)];
48
+ }
49
+ if (!this.availableMethod.defaultUnstake && !fastLeave) {
50
+ return [new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR)];
51
+ }
52
+ if (!this.availableMethod.fastUnstake && fastLeave) {
53
+ return [new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR)];
54
+ }
55
+ const errors = [];
56
+ const bnActiveStake = new _util.BN(poolPosition.activeStake);
57
+ const bnAmount = new _util.BN(amount);
58
+ const bnRemainingStake = bnActiveStake.sub(bnAmount);
59
+ const minStake = new _util.BN(poolInfo.statistic.earningThreshold.join || '0');
60
+ const minUnstake = new _util.BN((fastLeave ? poolInfo.statistic.earningThreshold.fastUnstake : poolInfo.statistic.earningThreshold.defaultUnstake) || '0');
61
+ const maxUnstakeRequest = poolInfo.statistic.maxWithdrawalRequestPerFarmer;
62
+ const derivativeTokenInfo = this.state.getAssetBySlug(this.derivativeAssets[0]);
63
+ if (bnAmount.lte(_util.BN_ZERO)) {
64
+ return [new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)('Amount must be greater than 0'))];
65
+ }
66
+ if (bnAmount.lt(minUnstake)) {
67
+ const minUnstakeStr = (0, _utils2.formatNumber)(minUnstake.toString(), derivativeTokenInfo.decimals || 0);
68
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.NOT_ENOUGH_MIN_UNSTAKE, (0, _i18next.t)('You need to unstake at least {{amount}} {{token}}', {
69
+ replace: {
70
+ amount: minUnstakeStr,
71
+ token: derivativeTokenInfo.symbol
72
+ }
73
+ })));
74
+ }
75
+ if (!fastLeave) {
76
+ if (!(bnRemainingStake.isZero() || bnRemainingStake.gte(minStake))) {
77
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.INVALID_ACTIVE_STAKE)); // TODO
78
+ }
79
+
80
+ if (poolPosition.unstakings.length > maxUnstakeRequest) {
81
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.EXCEED_MAX_UNSTAKING, (0, _i18next.t)('You cannot unstake more than {{number}} times', {
82
+ replace: {
83
+ number: maxUnstakeRequest
84
+ }
85
+ })));
86
+ }
87
+ }
88
+ if (bnRemainingStake.lt(_util.BN_ZERO)) {
89
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.INVALID_ACTIVE_STAKE)); // TODO
90
+ }
91
+
92
+ return Promise.resolve(errors);
93
+ }
40
94
 
41
95
  /* Leave pool action */
42
96
  }
@@ -217,7 +217,7 @@ class BifrostLiquidStakingPoolHandler extends _base.default {
217
217
  totalStake: totalBalance.toString(),
218
218
  activeStake: bnActiveBalance.toString(),
219
219
  unstakeBalance: unlockBalance.toString(),
220
- status: bnActiveBalance.eq(_util.BN_ZERO) ? _types.EarningStatus.NOT_EARNING : _types.EarningStatus.EARNING_REWARD,
220
+ status: bnActiveBalance.gt(_util.BN_ZERO) ? _types.EarningStatus.EARNING_REWARD : _types.EarningStatus.NOT_EARNING,
221
221
  isBondedBefore: totalBalance.gt(_util.BN_ZERO.toString()),
222
222
  nominations: [],
223
223
  unstakings: unstakingList
@@ -270,7 +270,8 @@ class BifrostLiquidStakingPoolHandler extends _base.default {
270
270
  extrinsicType: _KoniTypes.ExtrinsicType.MINT_VDOT,
271
271
  extrinsic,
272
272
  txData: data,
273
- transferNativeAmount: '0'
273
+ transferNativeAmount: '0',
274
+ chainType: _KoniTypes.ChainType.SUBSTRATE
274
275
  };
275
276
  }
276
277
 
@@ -151,7 +151,7 @@ class ParallelLiquidStakingPoolHandler extends _base.default {
151
151
  totalStake: totalBalance.toString(),
152
152
  activeStake: activeBalance.toString(),
153
153
  unstakeBalance: unlockingBalance.toString(),
154
- status: _types.EarningStatus.EARNING_REWARD,
154
+ status: activeBalance.gt(_util.BN_ZERO) ? _types.EarningStatus.EARNING_REWARD : _types.EarningStatus.NOT_EARNING,
155
155
  derivativeToken: derivativeTokenSlug,
156
156
  isBondedBefore: totalBalance.gt(_util.BN_ZERO),
157
157
  nominations: [],
@@ -201,7 +201,8 @@ class ParallelLiquidStakingPoolHandler extends _base.default {
201
201
  extrinsicType: _KoniTypes.ExtrinsicType.MINT_SDOT,
202
202
  extrinsic,
203
203
  txData: data,
204
- transferNativeAmount: '0'
204
+ transferNativeAmount: '0',
205
+ chainType: _KoniTypes.ChainType.SUBSTRATE
205
206
  };
206
207
  }
207
208
 
@@ -156,7 +156,8 @@ class StellaSwapLiquidStakingPoolHandler extends _base.default {
156
156
  status: _types.UnstakingStatus.UNLOCKING
157
157
  });
158
158
  }
159
- const acviteToTotal = new _util.BN(balance).mul(exchangeRate).div(decimals);
159
+ const activeBalance = new _util.BN(balance);
160
+ const acviteToTotal = activeBalance.mul(exchangeRate).div(decimals);
160
161
  const totalBalance = acviteToTotal.add(unlockBalance);
161
162
  const result = {
162
163
  ...this.baseInfo,
@@ -168,7 +169,7 @@ class StellaSwapLiquidStakingPoolHandler extends _base.default {
168
169
  unstakeBalance: unlockBalance.toString(),
169
170
  isBondedBefore: totalBalance.gt(_util.BN_ZERO),
170
171
  derivativeToken: derivativeTokenSlug,
171
- status: _types.EarningStatus.EARNING_REWARD,
172
+ status: activeBalance.gt(_util.BN_ZERO) ? _types.EarningStatus.EARNING_REWARD : _types.EarningStatus.NOT_EARNING,
172
173
  nominations: [],
173
174
  unstakings
174
175
  };
@@ -231,9 +232,15 @@ class StellaSwapLiquidStakingPoolHandler extends _base.default {
231
232
 
232
233
  // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
233
234
  const depositCall = stakingContract.methods.deposit(params.amount);
234
-
235
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
236
- const estimatedDepositGas = await depositCall.estimateGas();
235
+ let estimatedDepositGas = 0;
236
+ try {
237
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
238
+ estimatedDepositGas = await depositCall.estimateGas({
239
+ from: params.address
240
+ });
241
+ } catch (e) {
242
+ console.error(e);
243
+ }
237
244
  const gasPrice = await evmApi.api.eth.getGasPrice();
238
245
  return {
239
246
  slug: this.feeAssets[0],
@@ -286,7 +293,8 @@ class StellaSwapLiquidStakingPoolHandler extends _base.default {
286
293
  extrinsicType: _KoniTypes.ExtrinsicType.TOKEN_APPROVE,
287
294
  extrinsic: transactionObject,
288
295
  txData: _data,
289
- transferNativeAmount: '0'
296
+ transferNativeAmount: '0',
297
+ chainType: _KoniTypes.ChainType.EVM
290
298
  });
291
299
  }
292
300
  async handleSubmitStep(data, path) {
@@ -322,7 +330,8 @@ class StellaSwapLiquidStakingPoolHandler extends _base.default {
322
330
  extrinsicType: _KoniTypes.ExtrinsicType.MINT_STDOT,
323
331
  extrinsic: transactionObject,
324
332
  txData: data,
325
- transferNativeAmount: '0'
333
+ transferNativeAmount: '0',
334
+ chainType: _KoniTypes.ChainType.EVM
326
335
  };
327
336
  }
328
337
 
@@ -24,7 +24,7 @@ class AmplitudeNativeStakingPoolHandler extends _basePara.default {
24
24
  async subscribePoolInfo(callback) {
25
25
  let cancel = false;
26
26
  const nativeToken = this.nativeToken;
27
- if (!this.isActive) {
27
+ const defaultCallback = async () => {
28
28
  const data = {
29
29
  ...this.baseInfo,
30
30
  type: this.type,
@@ -33,11 +33,16 @@ class AmplitudeNativeStakingPoolHandler extends _basePara.default {
33
33
  description: this.getDescription()
34
34
  }
35
35
  };
36
- callback(data);
36
+ const poolInfo = await this.getPoolInfo();
37
+ !poolInfo && callback(data);
38
+ };
39
+ if (!this.isActive) {
40
+ await defaultCallback();
37
41
  return () => {
38
42
  cancel = true;
39
43
  };
40
44
  }
45
+ await defaultCallback();
41
46
  const substrateApi = await this.substrateApi.isReady;
42
47
  const unsub = await substrateApi.api.query.parachainStaking.round(async _round => {
43
48
  if (cancel) {
@@ -57,7 +57,7 @@ class AstarNativeStakingPoolHandler extends _basePara.default {
57
57
  async subscribePoolInfo(callback) {
58
58
  let cancel = false;
59
59
  const nativeToken = this.nativeToken;
60
- if (!this.isActive) {
60
+ const defaultCallback = async () => {
61
61
  const data = {
62
62
  ...this.baseInfo,
63
63
  type: this.type,
@@ -66,11 +66,16 @@ class AstarNativeStakingPoolHandler extends _basePara.default {
66
66
  description: this.getDescription()
67
67
  }
68
68
  };
69
- callback(data);
69
+ const poolInfo = await this.getPoolInfo();
70
+ !poolInfo && callback(data);
71
+ };
72
+ if (!this.isActive) {
73
+ await defaultCallback();
70
74
  return () => {
71
75
  cancel = true;
72
76
  };
73
77
  }
78
+ await defaultCallback();
74
79
  const apyPromise = new Promise(resolve => {
75
80
  (0, _crossFetch.default)(`https://api.astar.network/api/v1/${this.chain}/dapps-staking/apy`, {
76
81
  method: 'GET'
@@ -67,7 +67,8 @@ class BaseNativeStakingPoolHandler extends _base.default {
67
67
  address: address,
68
68
  group: this.group,
69
69
  blockTimestamp: timeStamp,
70
- amount: item.amount
70
+ amount: item.amount,
71
+ eventIndex: item.event_index
71
72
  };
72
73
  callBack(data);
73
74
  }
@@ -134,7 +135,8 @@ class BaseNativeStakingPoolHandler extends _base.default {
134
135
  extrinsicType: _KoniTypes.ExtrinsicType.STAKING_BOND,
135
136
  extrinsic,
136
137
  txData: bondingData,
137
- transferNativeAmount: amount
138
+ transferNativeAmount: amount,
139
+ chainType: _KoniTypes.ChainType.SUBSTRATE
138
140
  };
139
141
  }
140
142
 
@@ -24,7 +24,7 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
24
24
  let cancel = false;
25
25
  const chainApi = this.substrateApi;
26
26
  const nativeToken = this.nativeToken;
27
- if (!this.isActive) {
27
+ const defaultCallback = async () => {
28
28
  const data = {
29
29
  ...this.baseInfo,
30
30
  type: this.type,
@@ -33,11 +33,16 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
33
33
  description: this.getDescription()
34
34
  }
35
35
  };
36
- callback(data);
36
+ const poolInfo = await this.getPoolInfo();
37
+ !poolInfo && callback(data);
38
+ };
39
+ if (!this.isActive) {
40
+ await defaultCallback();
37
41
  return () => {
38
42
  cancel = true;
39
43
  };
40
44
  }
45
+ await defaultCallback();
41
46
  await chainApi.isReady;
42
47
  const unsub = await chainApi.api.query.parachainStaking.round(async _round => {
43
48
  var _chainApi$api$consts, _chainApi$api$consts$, _chainApi$api$consts$2;
@@ -14,6 +14,7 @@ var _constants2 = require("@subwallet/extension-base/services/earning-service/co
14
14
  var _utils3 = require("@subwallet/extension-base/services/earning-service/utils");
15
15
  var _types = require("@subwallet/extension-base/types");
16
16
  var _utils4 = require("@subwallet/extension-base/utils");
17
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
17
18
  var _i18next = require("i18next");
18
19
  var _util = require("@polkadot/util");
19
20
  var _base = _interopRequireDefault(require("./base"));
@@ -29,7 +30,7 @@ class RelayNativeStakingPoolHandler extends _base.default {
29
30
  const substrateApi = this.substrateApi;
30
31
  const chainInfo = this.chainInfo;
31
32
  const nativeToken = this.nativeToken;
32
- if (!this.isActive) {
33
+ const defaultCallback = async () => {
33
34
  const data = {
34
35
  ...this.baseInfo,
35
36
  type: this.type,
@@ -38,11 +39,16 @@ class RelayNativeStakingPoolHandler extends _base.default {
38
39
  description: this.getDescription()
39
40
  }
40
41
  };
41
- callback(data);
42
+ const poolInfo = await this.getPoolInfo();
43
+ !poolInfo && callback(data);
44
+ };
45
+ if (!this.isActive) {
46
+ await defaultCallback();
42
47
  return () => {
43
48
  cancel = true;
44
49
  };
45
50
  }
51
+ await defaultCallback();
46
52
  await substrateApi.isReady;
47
53
  const unsub = await ((_substrateApi$api$que = substrateApi.api.query.staking) === null || _substrateApi$api$que === void 0 ? void 0 : _substrateApi$api$que.currentEra(async _currentEra => {
48
54
  var _substrateApi$api$con, _substrateApi$api$con2, _substrateApi$api$que2, _substrateApi$api$que3, _substrateApi$api$que4, _substrateApi$api$que5, _substrateApi$api$que6;
@@ -134,7 +140,10 @@ class RelayNativeStakingPoolHandler extends _base.default {
134
140
  let nominationStatus = _types.EarningStatus.NOT_EARNING;
135
141
  const [[identity], _eraStaker] = await Promise.all([(0, _utils3.parseIdentity)(substrateApi, validatorAddress), substrateApi.api.query.staking.erasStakers(currentEra, validatorAddress)]);
136
142
  const eraStaker = _eraStaker.toPrimitive();
137
- const topNominators = eraStaker.others.map(nominator => {
143
+ const sortedNominators = eraStaker.others.sort((a, b) => {
144
+ return new _bignumber.default(b.value).minus(a.value).toNumber();
145
+ });
146
+ const topNominators = sortedNominators.map(nominator => {
138
147
  return nominator.who;
139
148
  });
140
149
  if (!topNominators.includes((0, _utils4.reformatAddress)(address, (0, _utils2._getChainSubstrateAddressPrefix)(chainInfo)))) {
@@ -54,7 +54,7 @@ class NominationPoolHandler extends _base.default {
54
54
  const substrateApi = this.substrateApi;
55
55
  const chainInfo = this.chainInfo;
56
56
  const nativeToken = this.nativeToken;
57
- if (!this.isActive) {
57
+ const defaultCallback = async () => {
58
58
  const data = {
59
59
  ...this.baseInfo,
60
60
  type: this.type,
@@ -63,11 +63,16 @@ class NominationPoolHandler extends _base.default {
63
63
  description: this.getDescription()
64
64
  }
65
65
  };
66
- callback(data);
66
+ const poolInfo = await this.getPoolInfo();
67
+ !poolInfo && callback(data);
68
+ };
69
+ if (!this.isActive) {
70
+ await defaultCallback();
67
71
  return () => {
68
72
  cancel = true;
69
73
  };
70
74
  }
75
+ await defaultCallback();
71
76
  await substrateApi.isReady;
72
77
  const unsub = await ((_substrateApi$api$que = substrateApi.api.query.staking) === null || _substrateApi$api$que === void 0 ? void 0 : _substrateApi$api$que.currentEra(async _currentEra => {
73
78
  var _substrateApi$api$que2, _substrateApi$api$que3, _substrateApi$api$que4;
@@ -470,7 +475,8 @@ class NominationPoolHandler extends _base.default {
470
475
  extrinsicType: _KoniTypes.ExtrinsicType.STAKING_JOIN_POOL,
471
476
  extrinsic,
472
477
  txData: joinPoolData,
473
- transferNativeAmount: amount
478
+ transferNativeAmount: amount,
479
+ chainType: _KoniTypes.ChainType.SUBSTRATE
474
480
  };
475
481
  }
476
482
 
@@ -62,7 +62,7 @@ class BaseSpecialStakingPoolHandler extends _base.default {
62
62
  if (!poolInfo || !((_poolInfo$statistic = poolInfo.statistic) !== null && _poolInfo$statistic !== void 0 && _poolInfo$statistic.earningThreshold.join)) {
63
63
  return {
64
64
  passed: false,
65
- errorMessage: 'There\'s a trouble fetching data, please check your internet connection and try again'
65
+ errorMessage: 'There is a problem fetching your data. Check your Internet connection or change the network endpoint and try again.'
66
66
  };
67
67
  }
68
68
  if (request.address === _constants.ALL_ACCOUNT_KEY) {
@@ -83,14 +83,13 @@ class BaseSpecialStakingPoolHandler extends _base.default {
83
83
  const bnMinJoinPool = new _util.BN(poolInfo.statistic.earningThreshold.join);
84
84
  const inputTokenInfo = this.state.chainService.getAssetBySlug(this.inputAsset);
85
85
  const altInputTokenInfo = this.state.chainService.getAssetBySlug(this.altInputAsset);
86
- const minJoinDiv = _util.BN_TEN.pow(new _util.BN(inputAssetInfo.decimals || 0));
87
- const parsedMinJoinPool = bnMinJoinPool.div(minJoinDiv);
88
86
  if (bnInputAssetBalance.add(bnAltInputAssetBalance).lt(bnMinJoinPool)) {
89
87
  const originChain = this.state.getChainInfo(inputTokenInfo.originChain);
90
88
  const altChain = this.state.getChainInfo(altInputTokenInfo.originChain);
89
+ const parsedMinJoinPool = (0, _utils3.formatNumber)(bnMinJoinPool.toString(), inputAssetInfo.decimals || 0);
91
90
  return {
92
91
  passed: false,
93
- errorMessage: `You need at least ${parsedMinJoinPool.toString()} ${inputTokenInfo.symbol} (${originChain.name}) or ${altInputTokenInfo.symbol} (${altChain.name}) to start earning`
92
+ errorMessage: `You need at least ${parsedMinJoinPool} ${inputTokenInfo.symbol} (${originChain.name}) or ${altInputTokenInfo.symbol} (${altChain.name}) to start earning`
94
93
  };
95
94
  }
96
95
  if (this.feeAssets.length === 1) {
@@ -120,24 +119,29 @@ class BaseSpecialStakingPoolHandler extends _base.default {
120
119
 
121
120
  async subscribePoolInfo(callback) {
122
121
  let cancel = false;
122
+ const _callback = data => {
123
+ !cancel && callback(data);
124
+ };
125
+ const defaultCallback = async () => {
126
+ const data = {
127
+ ...this.baseInfo,
128
+ type: this.type,
129
+ metadata: {
130
+ ...this.metadataInfo,
131
+ description: this.getDescription()
132
+ }
133
+ };
134
+ const poolInfo = await this.getPoolInfo();
135
+ !poolInfo && _callback(data);
136
+ };
123
137
  const getStatInterval = () => {
124
138
  if (!this.isActive) {
125
- if (!cancel) {
126
- const rs = {
127
- ...this.baseInfo,
128
- type: this.type,
129
- metadata: {
130
- ...this.metadataInfo,
131
- description: this.getDescription()
132
- }
133
- };
134
- callback(rs);
135
- }
139
+ defaultCallback().catch(console.error);
136
140
  } else {
137
- this.getPoolStat().then(rs => {
138
- if (!cancel) {
139
- callback(rs);
140
- }
141
+ defaultCallback().then(() => {
142
+ return this.getPoolStat();
143
+ }).then(rs => {
144
+ _callback(rs);
141
145
  }).catch(console.error);
142
146
  }
143
147
  };
@@ -270,6 +274,7 @@ class BaseSpecialStakingPoolHandler extends _base.default {
270
274
  const bnAmount = new _util.BN(params.amount);
271
275
  const altInputTokenSlug = this.altInputAsset || '';
272
276
  const altInputTokenInfo = this.state.getAssetBySlug(altInputTokenSlug);
277
+ const inputTokenInfo = this.state.getAssetBySlug(this.inputAsset);
273
278
  const altInputTokenBalance = await this.state.balanceService.getTokenFreeBalance(params.address, altInputTokenInfo.originChain, altInputTokenSlug);
274
279
  const missingAmount = bnAmount.sub(bnInputTokenBalance); // TODO: what if input token is not LOCAL ??
275
280
  const xcmFee = new _util.BN(path.totalFee[1].amount || '0');
@@ -280,6 +285,26 @@ class BaseSpecialStakingPoolHandler extends _base.default {
280
285
  processValidation.failedStep = path.steps[1];
281
286
  processValidation.ok = false;
282
287
  processValidation.status = _types.YieldValidationStatus.NOT_ENOUGH_BALANCE;
288
+ const maxBn = bnInputTokenBalance.add(new _util.BN(altInputTokenBalance.value)).sub(xcmFee).sub(altInputTokenMinAmount);
289
+ const maxValue = (0, _utils3.formatNumber)(maxBn.toString(), inputTokenInfo.decimals || 0);
290
+ const altInputTokenInfo = this.state.getAssetBySlug(altInputTokenSlug);
291
+ const symbol = altInputTokenInfo.symbol;
292
+ const altNetwork = this.state.getChainInfo(altInputTokenInfo.originChain);
293
+ const inputNetworkName = this.chainInfo.name;
294
+ const altNetworkName = altNetwork.name;
295
+ const currentValue = (0, _utils3.formatNumber)(bnInputTokenBalance.toString(), inputTokenInfo.decimals || 0);
296
+ const bnMaxXCM = new _util.BN(altInputTokenBalance.value).sub(xcmFee).sub(altInputTokenMinAmount);
297
+ const maxXCMValue = (0, _utils3.formatNumber)(bnMaxXCM.toString(), inputTokenInfo.decimals || 0);
298
+ processValidation.message = (0, _i18next.t)('You can only enter a maximum of {{maxValue}} {{symbol}}, which is {{currentValue}} {{symbol}} ({{inputNetworkName}}) and {{maxXCMValue}} {{symbol}} ({{altNetworkName}}). Lower your amount and try again.', {
299
+ replace: {
300
+ symbol,
301
+ maxValue,
302
+ inputNetworkName,
303
+ altNetworkName,
304
+ currentValue,
305
+ maxXCMValue
306
+ }
307
+ });
283
308
  return [new _TransactionError.TransactionError(_types.YieldValidationStatus.NOT_ENOUGH_BALANCE, processValidation.message, processValidation)];
284
309
  }
285
310
  return [];
@@ -299,6 +324,7 @@ class BaseSpecialStakingPoolHandler extends _base.default {
299
324
  };
300
325
  const feeTokenSlug = path.totalFee[id].slug;
301
326
  const feeTokenInfo = this.state.getAssetBySlug(feeTokenSlug);
327
+ const inputTokenInfo = this.state.getAssetBySlug(this.inputAsset);
302
328
  const defaultFeeTokenSlug = this.feeAssets[0];
303
329
  const bnAmount = new _util.BN(params.amount);
304
330
  if (this.feeAssets.length === 1 && feeTokenSlug === defaultFeeTokenSlug) {
@@ -324,6 +350,16 @@ class BaseSpecialStakingPoolHandler extends _base.default {
324
350
  processValidation.failedStep = path.steps[id];
325
351
  processValidation.ok = false;
326
352
  processValidation.status = _types.YieldValidationStatus.NOT_ENOUGH_BALANCE;
353
+ const maxString = (0, _utils3.formatNumber)(bnInputTokenBalance.toString(), inputTokenInfo.decimals || 0);
354
+ if (maxString !== '0') {
355
+ processValidation.message = (0, _i18next.t)('Amount must be equal or less than {{number}}', {
356
+ replace: {
357
+ number: maxString
358
+ }
359
+ });
360
+ } else {
361
+ processValidation.message = (0, _i18next.t)('You need balance greater than 0 to continue');
362
+ }
327
363
  return [new _TransactionError.TransactionError(_types.YieldValidationStatus.NOT_ENOUGH_BALANCE, processValidation.message, processValidation)];
328
364
  }
329
365
  return [];
@@ -407,7 +443,8 @@ class BaseSpecialStakingPoolHandler extends _base.default {
407
443
  extrinsicType: _KoniTypes.ExtrinsicType.TRANSFER_XCM,
408
444
  extrinsic,
409
445
  txData: xcmData,
410
- transferNativeAmount: bnTotalAmount.toString()
446
+ transferNativeAmount: bnTotalAmount.toString(),
447
+ chainType: _KoniTypes.ChainType.SUBSTRATE
411
448
  };
412
449
  }
413
450
  handleYieldJoin(data, path, currentStep) {
@@ -433,53 +470,6 @@ class BaseSpecialStakingPoolHandler extends _base.default {
433
470
 
434
471
  /* Leave pool action */
435
472
 
436
- async validateYieldLeave(amount, address, fastLeave, selectedTarget) {
437
- const poolInfo = await this.getPoolInfo();
438
- const poolPosition = await this.getPoolPosition(address);
439
- if (!poolInfo || !poolInfo.statistic || !poolPosition) {
440
- return [new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR)];
441
- }
442
- if (!this.availableMethod.defaultUnstake && !fastLeave) {
443
- return [new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR)];
444
- }
445
- if (!this.availableMethod.fastUnstake && fastLeave) {
446
- return [new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR)];
447
- }
448
- const errors = [];
449
- const bnActiveStake = new _util.BN(poolPosition.activeStake);
450
- const bnAmount = new _util.BN(amount);
451
- const bnRemainingStake = bnActiveStake.sub(bnAmount);
452
- const minStake = new _util.BN(poolInfo.statistic.earningThreshold.join || '0');
453
- const minUnstake = new _util.BN((fastLeave ? poolInfo.statistic.earningThreshold.fastUnstake : poolInfo.statistic.earningThreshold.defaultUnstake) || '0');
454
- const maxUnstakeRequest = poolInfo.statistic.maxWithdrawalRequestPerFarmer;
455
- const derivativeTokenInfo = this.state.getAssetBySlug(this.derivativeAssets[0]);
456
- if (bnAmount.lte(_util.BN_ZERO)) {
457
- return [new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)('Amount must be greater than 0'))];
458
- }
459
- if (bnAmount.lt(minUnstake)) {
460
- const minUnstakeStr = (0, _utils3.formatNumber)(minUnstake.toString(), derivativeTokenInfo.decimals || 0);
461
- errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.NOT_ENOUGH_MIN_UNSTAKE, (0, _i18next.t)('You need to unstake at least {{amount}} {{token}}', {
462
- replace: {
463
- amount: minUnstakeStr,
464
- token: derivativeTokenInfo.symbol
465
- }
466
- })));
467
- }
468
- if (!fastLeave) {
469
- if (!(bnRemainingStake.isZero() || bnRemainingStake.gte(minStake))) {
470
- errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.INVALID_ACTIVE_STAKE)); // TODO
471
- }
472
-
473
- if (poolPosition.unstakings.length > maxUnstakeRequest) {
474
- errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.EXCEED_MAX_UNSTAKING, (0, _i18next.t)('You cannot unstake more than {{number}} times', {
475
- replace: {
476
- number: maxUnstakeRequest
477
- }
478
- })));
479
- }
480
- }
481
- return Promise.resolve(errors);
482
- }
483
473
  handleYieldUnstake(amount, address, selectedTarget) {
484
474
  return Promise.reject(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.UNSUPPORTED));
485
475
  }