@subwallet/extension-base 1.1.28-beta.3 → 1.1.29-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 (30) hide show
  1. package/cjs/packageInfo.js +1 -1
  2. package/cjs/services/earning-service/handlers/base.js +11 -1
  3. package/cjs/services/earning-service/handlers/lending/interlay.js +15 -9
  4. package/cjs/services/earning-service/handlers/liquid-staking/acala.js +14 -6
  5. package/cjs/services/earning-service/handlers/liquid-staking/bifrost.js +14 -6
  6. package/cjs/services/earning-service/handlers/liquid-staking/parallel.js +14 -6
  7. package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +21 -14
  8. package/cjs/services/earning-service/handlers/native-staking/amplitude.js +10 -3
  9. package/cjs/services/earning-service/handlers/native-staking/astar.js +13 -5
  10. package/cjs/services/earning-service/handlers/native-staking/para-chain.js +10 -4
  11. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +23 -12
  12. package/cjs/services/earning-service/handlers/nomination-pool/index.js +11 -4
  13. package/cjs/services/earning-service/handlers/special.js +22 -21
  14. package/package.json +6 -6
  15. package/packageInfo.js +1 -1
  16. package/services/earning-service/handlers/base.d.ts +1 -0
  17. package/services/earning-service/handlers/base.js +12 -1
  18. package/services/earning-service/handlers/lending/interlay.js +14 -8
  19. package/services/earning-service/handlers/liquid-staking/acala.js +14 -6
  20. package/services/earning-service/handlers/liquid-staking/bifrost.js +14 -6
  21. package/services/earning-service/handlers/liquid-staking/parallel.js +14 -6
  22. package/services/earning-service/handlers/liquid-staking/stella-swap.js +19 -12
  23. package/services/earning-service/handlers/native-staking/amplitude.js +10 -3
  24. package/services/earning-service/handlers/native-staking/astar.js +13 -5
  25. package/services/earning-service/handlers/native-staking/para-chain.js +10 -4
  26. package/services/earning-service/handlers/native-staking/relay-chain.js +23 -12
  27. package/services/earning-service/handlers/nomination-pool/index.js +11 -4
  28. package/services/earning-service/handlers/special.d.ts +2 -1
  29. package/services/earning-service/handlers/special.js +4 -3
  30. package/types/yield/info/chain/info.d.ts +12 -3
@@ -13,6 +13,6 @@ const packageInfo = {
13
13
  name: '@subwallet/extension-base',
14
14
  path: typeof __dirname === 'string' ? __dirname : 'auto',
15
15
  type: 'cjs',
16
- version: '1.1.28-1'
16
+ version: '1.1.29-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
8
8
  var _constants = require("@subwallet/extension-base/services/earning-service/constants");
9
+ var _util = require("@polkadot/util");
9
10
  // Copyright 2019-2022 @subwallet/extension-base
10
11
  // SPDX-License-Identifier: Apache-2.0
11
12
 
@@ -70,6 +71,13 @@ class BasePoolHandler {
70
71
  slug: this.slug
71
72
  };
72
73
  }
74
+ get maintainBalance() {
75
+ const decimals = this.nativeToken.decimals || 0;
76
+ const defaultMaintainBalance = new _util.BN(1).mul(_util.BN_TEN.pow(new _util.BN(decimals)));
77
+ const ed = new _util.BN(this.nativeToken.minAmount || '0');
78
+ const maintainBalance = ed.gt(defaultMaintainBalance) ? ed.mul(new _util.BN(1.5)) : defaultMaintainBalance;
79
+ return maintainBalance.toString();
80
+ }
73
81
  get metadataInfo() {
74
82
  return {
75
83
  name: this.name,
@@ -77,7 +85,9 @@ class BasePoolHandler {
77
85
  logo: this.logo,
78
86
  inputAsset: this.nativeToken.slug,
79
87
  isAvailable: true,
80
- allowCancelUnstaking: false
88
+ allowCancelUnstaking: false,
89
+ maintainAsset: this.nativeToken.slug,
90
+ maintainBalance: this.maintainBalance
81
91
  };
82
92
  }
83
93
 
@@ -9,7 +9,6 @@ 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/services/chain-service/utils");
11
11
  var _types = require("@subwallet/extension-base/types");
12
- var _bn = _interopRequireDefault(require("bn.js"));
13
12
  var _util = require("@polkadot/util");
14
13
  var _constants = require("../../constants");
15
14
  var _base = _interopRequireDefault(require("./base"));
@@ -124,12 +123,19 @@ class InterlayLendingPoolHandler extends _base.default {
124
123
  const inputTokenSlug = this.inputAsset;
125
124
  const inputTokenInfo = this.state.getAssetBySlug(inputTokenSlug);
126
125
  const defaultFeeTokenSlug = this.feeAssets[0];
127
- const _mintFeeInfo = await poolOriginSubstrateApi.api.tx.loans.mint((0, _utils._getTokenOnChainInfo)(inputTokenInfo), params.amount).paymentInfo(_constants.fakeAddress);
128
- const mintFeeInfo = _mintFeeInfo.toPrimitive();
129
- return {
130
- amount: mintFeeInfo.partialFee.toString(),
131
- slug: defaultFeeTokenSlug
132
- };
126
+ if (new _util.BN(params.amount).gt(_util.BN_ZERO)) {
127
+ const _mintFeeInfo = await poolOriginSubstrateApi.api.tx.loans.mint((0, _utils._getTokenOnChainInfo)(inputTokenInfo), params.amount).paymentInfo(_constants.fakeAddress);
128
+ const mintFeeInfo = _mintFeeInfo.toPrimitive();
129
+ return {
130
+ amount: mintFeeInfo.partialFee.toString(),
131
+ slug: defaultFeeTokenSlug
132
+ };
133
+ } else {
134
+ return {
135
+ amount: '0',
136
+ slug: defaultFeeTokenSlug
137
+ };
138
+ }
133
139
  }
134
140
  async handleSubmitStep(data, path) {
135
141
  const substrateApi = await this.substrateApi.isReady;
@@ -158,8 +164,8 @@ class InterlayLendingPoolHandler extends _base.default {
158
164
  if (!yieldPositionInfo) {
159
165
  return Promise.reject(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INVALID_PARAMS));
160
166
  }
161
- const bnAmount = new _bn.default(amount);
162
- const bnActiveBalance = new _bn.default(yieldPositionInfo.activeStake);
167
+ const bnAmount = new _util.BN(amount);
168
+ const bnActiveBalance = new _util.BN(yieldPositionInfo.activeStake);
163
169
  const redeemAll = bnAmount.eq(bnActiveBalance);
164
170
  const extrinsic = !redeemAll ? substrateApi.api.tx.loans.redeem((0, _utils._getTokenOnChainInfo)(inputTokenInfo), amount) : substrateApi.api.tx.loans.redeemAll((0, _utils._getTokenOnChainInfo)(inputTokenInfo));
165
171
  return [_KoniTypes.ExtrinsicType.REDEEM_QDOT, extrinsic];
@@ -79,6 +79,7 @@ class AcalaLiquidStakingPoolHandler extends _base.default {
79
79
  apy: apy * 100,
80
80
  exchangeRate: latestExchangeRate / decimals
81
81
  }],
82
+ unstakingPeriod: 24 * 28,
82
83
  maxCandidatePerFarmer: 1,
83
84
  maxWithdrawalRequestPerFarmer: 1,
84
85
  minJoinPool: '50000000000',
@@ -146,12 +147,19 @@ class AcalaLiquidStakingPoolHandler extends _base.default {
146
147
  async getSubmitStepFee(params) {
147
148
  const poolOriginSubstrateApi = await this.substrateApi.isReady;
148
149
  const defaultFeeTokenSlug = this.feeAssets[0];
149
- const _mintFeeInfo = await poolOriginSubstrateApi.api.tx.homa.mint(params.amount).paymentInfo(_constants.fakeAddress);
150
- const mintFeeInfo = _mintFeeInfo.toPrimitive();
151
- return {
152
- amount: mintFeeInfo.partialFee.toString(),
153
- slug: defaultFeeTokenSlug
154
- };
150
+ if (new _util.BN(params.amount).gt(_util.BN_ZERO)) {
151
+ const _mintFeeInfo = await poolOriginSubstrateApi.api.tx.homa.mint(params.amount).paymentInfo(_constants.fakeAddress);
152
+ const mintFeeInfo = _mintFeeInfo.toPrimitive();
153
+ return {
154
+ amount: mintFeeInfo.partialFee.toString(),
155
+ slug: defaultFeeTokenSlug
156
+ };
157
+ } else {
158
+ return {
159
+ amount: '0',
160
+ slug: defaultFeeTokenSlug
161
+ };
162
+ }
155
163
  }
156
164
  async handleSubmitStep(data, path) {
157
165
  const substrateApi = await this.substrateApi.isReady;
@@ -81,6 +81,7 @@ class BifrostLiquidStakingPoolHandler extends _base.default {
81
81
  apy: parseFloat(vDOTStats.apyBase),
82
82
  exchangeRate: parseFloat(exchangeRate.data.slp_polkadot_ratio[0].ratio)
83
83
  }],
84
+ unstakingPeriod: 24 * 28,
84
85
  maxCandidatePerFarmer: 1,
85
86
  maxWithdrawalRequestPerFarmer: 1,
86
87
  minJoinPool: '5000000000',
@@ -222,12 +223,19 @@ class BifrostLiquidStakingPoolHandler extends _base.default {
222
223
  const inputTokenSlug = this.inputAsset;
223
224
  const inputTokenInfo = this.state.getAssetBySlug(inputTokenSlug);
224
225
  const defaultFeeTokenSlug = this.feeAssets[0];
225
- const _mintFeeInfo = await poolOriginSubstrateApi.api.tx.vtokenMinting.mint((0, _utils._getTokenOnChainInfo)(inputTokenInfo), params.amount, null).paymentInfo(_constants2.fakeAddress);
226
- const mintFeeInfo = _mintFeeInfo.toPrimitive();
227
- return {
228
- amount: mintFeeInfo.partialFee.toString(),
229
- slug: defaultFeeTokenSlug
230
- };
226
+ if (new _util.BN(params.amount).gt(_util.BN_ZERO)) {
227
+ const _mintFeeInfo = await poolOriginSubstrateApi.api.tx.vtokenMinting.mint((0, _utils._getTokenOnChainInfo)(inputTokenInfo), params.amount, null).paymentInfo(_constants2.fakeAddress);
228
+ const mintFeeInfo = _mintFeeInfo.toPrimitive();
229
+ return {
230
+ amount: mintFeeInfo.partialFee.toString(),
231
+ slug: defaultFeeTokenSlug
232
+ };
233
+ } else {
234
+ return {
235
+ amount: '0',
236
+ slug: defaultFeeTokenSlug
237
+ };
238
+ }
231
239
  }
232
240
  async handleSubmitStep(data, path) {
233
241
  const substrateApi = await this.substrateApi.isReady;
@@ -70,6 +70,7 @@ class ParallelLiquidStakingPoolHandler extends _base.default {
70
70
  apy: apy * 100,
71
71
  exchangeRate: exchangeRate / decimals
72
72
  }],
73
+ unstakingPeriod: 24 * 28,
73
74
  maxCandidatePerFarmer: 1,
74
75
  maxWithdrawalRequestPerFarmer: 1,
75
76
  minJoinPool: '10000000000',
@@ -142,12 +143,19 @@ class ParallelLiquidStakingPoolHandler extends _base.default {
142
143
  async getSubmitStepFee(params) {
143
144
  const poolOriginSubstrateApi = await this.substrateApi.isReady;
144
145
  const defaultFeeTokenSlug = this.feeAssets[0];
145
- const _mintFeeInfo = await poolOriginSubstrateApi.api.tx.liquidStaking.stake(params.amount).paymentInfo(_constants.fakeAddress);
146
- const mintFeeInfo = _mintFeeInfo.toPrimitive();
147
- return {
148
- amount: mintFeeInfo.partialFee.toString(),
149
- slug: defaultFeeTokenSlug
150
- };
146
+ if (new _util.BN(params.amount).gt(_util.BN_ZERO)) {
147
+ const _mintFeeInfo = await poolOriginSubstrateApi.api.tx.liquidStaking.stake(params.amount).paymentInfo(_constants.fakeAddress);
148
+ const mintFeeInfo = _mintFeeInfo.toPrimitive();
149
+ return {
150
+ amount: mintFeeInfo.partialFee.toString(),
151
+ slug: defaultFeeTokenSlug
152
+ };
153
+ } else {
154
+ return {
155
+ amount: '0',
156
+ slug: defaultFeeTokenSlug
157
+ };
158
+ }
151
159
  }
152
160
  async handleSubmitStep(data, path) {
153
161
  const substrateApi = await this.substrateApi.isReady;
@@ -10,7 +10,6 @@ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
10
10
  var _web = require("@subwallet/extension-base/koni/api/tokens/evm/web3");
11
11
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
12
12
  var _types = require("@subwallet/extension-base/types");
13
- var _bn = require("bn.js");
14
13
  var _crossFetch = _interopRequireDefault(require("cross-fetch"));
15
14
  var _util = require("@polkadot/util");
16
15
  var _constants = require("../../constants");
@@ -90,6 +89,7 @@ class StellaSwapLiquidStakingPoolHandler extends _base.default {
90
89
  apr: aprObject.result,
91
90
  exchangeRate: exchangeRate
92
91
  }],
92
+ unstakingPeriod: 24 * 28,
93
93
  maxCandidatePerFarmer: 1,
94
94
  maxWithdrawalRequestPerFarmer: 1,
95
95
  minJoinPool: '0',
@@ -126,7 +126,7 @@ class StellaSwapLiquidStakingPoolHandler extends _base.default {
126
126
  const unstakings = [];
127
127
  let unlockBalance = _util.BN_ZERO;
128
128
  if (parseInt(unbondedObject.unbonded) > 0) {
129
- unlockBalance = unlockBalance.add(new _bn.BN(unbondedObject.unbonded));
129
+ unlockBalance = unlockBalance.add(new _util.BN(unbondedObject.unbonded));
130
130
  unstakings.push({
131
131
  chain: this.chain,
132
132
  claimable: unbondedObject.unbonded,
@@ -135,7 +135,7 @@ class StellaSwapLiquidStakingPoolHandler extends _base.default {
135
135
  });
136
136
  }
137
137
  if (parseInt(unbondedObject.waiting) > 0) {
138
- unlockBalance = unlockBalance.add(new _bn.BN(unbondedObject.waiting));
138
+ unlockBalance = unlockBalance.add(new _util.BN(unbondedObject.waiting));
139
139
  unstakings.push({
140
140
  chain: this.chain,
141
141
  claimable: unbondedObject.waiting,
@@ -144,7 +144,7 @@ class StellaSwapLiquidStakingPoolHandler extends _base.default {
144
144
  });
145
145
  }
146
146
 
147
- const totalBalance = new _bn.BN(balance).add(unlockBalance);
147
+ const totalBalance = new _util.BN(balance).add(unlockBalance);
148
148
  const result = {
149
149
  ...this.baseInfo,
150
150
  type: this.type,
@@ -214,18 +214,25 @@ class StellaSwapLiquidStakingPoolHandler extends _base.default {
214
214
  const evmApi = this.evmApi;
215
215
  const derivativeTokenSlug = this.derivativeAssets[0];
216
216
  const derivativeTokenInfo = this.state.getAssetBySlug(derivativeTokenSlug);
217
- const stakingContract = getStellaswapLiquidStakingContract(this.chain, (0, _utils._getContractAddressOfToken)(derivativeTokenInfo), evmApi);
217
+ if (new _util.BN(params.amount).gt(_util.BN_ZERO)) {
218
+ const stakingContract = getStellaswapLiquidStakingContract(this.chain, (0, _utils._getContractAddressOfToken)(derivativeTokenInfo), evmApi);
218
219
 
219
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
220
- const depositCall = stakingContract.methods.deposit(params.amount);
220
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
221
+ const depositCall = stakingContract.methods.deposit(params.amount);
221
222
 
222
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
223
- const estimatedDepositGas = await depositCall.estimateGas();
224
- const gasPrice = await evmApi.api.eth.getGasPrice();
225
- return {
226
- slug: this.feeAssets[0],
227
- amount: (estimatedDepositGas * parseInt(gasPrice)).toString()
228
- };
223
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
224
+ const estimatedDepositGas = await depositCall.estimateGas();
225
+ const gasPrice = await evmApi.api.eth.getGasPrice();
226
+ return {
227
+ slug: this.feeAssets[0],
228
+ amount: (estimatedDepositGas * parseInt(gasPrice)).toString()
229
+ };
230
+ } else {
231
+ return {
232
+ slug: this.feeAssets[0],
233
+ amount: '0'
234
+ };
235
+ }
229
236
  }
230
237
  async generateOptimalPath(params) {
231
238
  const result = {
@@ -67,6 +67,9 @@ class AmplitudeNativeStakingPoolHandler extends _basePara.default {
67
67
  description: this.getDescription(minToHuman)
68
68
  },
69
69
  statistic: {
70
+ assetEarning: [{
71
+ slug: this.nativeToken.slug
72
+ }],
70
73
  maxCandidatePerFarmer: parseInt(maxDelegations),
71
74
  maxWithdrawalRequestPerFarmer: 1,
72
75
  // by default
@@ -288,13 +291,17 @@ class AmplitudeNativeStakingPoolHandler extends _basePara.default {
288
291
  const binaryAmount = new _util.BN(amount);
289
292
  const poolPosition = await this.getPoolPosition(address);
290
293
  const selectedValidatorInfo = targetValidators[0];
294
+
295
+ // eslint-disable-next-line @typescript-eslint/require-await
291
296
  const compoundResult = async extrinsic => {
292
297
  const tokenSlug = this.nativeToken.slug;
293
- const feeInfo = await extrinsic.paymentInfo(address);
294
- const fee = feeInfo.toPrimitive();
298
+ // const feeInfo = await extrinsic.paymentInfo(address);
299
+ // const fee = feeInfo.toPrimitive() as unknown as RuntimeDispatchInfo;
300
+
301
+ // Not use the fee to validate and to display on UI
295
302
  return [extrinsic, {
296
303
  slug: tokenSlug,
297
- amount: fee.partialFee.toString()
304
+ amount: '0'
298
305
  }];
299
306
  };
300
307
  if (!poolPosition) {
@@ -74,7 +74,10 @@ class AstarNativeStakingPoolHandler extends _basePara.default {
74
74
  method: 'GET'
75
75
  }).then(resp => {
76
76
  resolve(resp.json());
77
- }).catch(console.error);
77
+ }).catch(e => {
78
+ console.error(e);
79
+ resolve(null);
80
+ });
78
81
  });
79
82
  const timeout = new Promise(resolve => {
80
83
  const id = setTimeout(() => {
@@ -110,6 +113,10 @@ class AstarNativeStakingPoolHandler extends _basePara.default {
110
113
  description: this.getDescription(minToHuman)
111
114
  },
112
115
  statistic: {
116
+ assetEarning: [{
117
+ slug: this.nativeToken.slug,
118
+ apy: apyInfo !== null ? apyInfo : undefined
119
+ }],
113
120
  maxCandidatePerFarmer: 100,
114
121
  // temporary fix for Astar, there's no limit for now
115
122
  maxWithdrawalRequestPerFarmer: 1,
@@ -346,7 +353,6 @@ class AstarNativeStakingPoolHandler extends _basePara.default {
346
353
  async createJoinExtrinsic(data, positionInfo) {
347
354
  let bondDest = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'Staked';
348
355
  const {
349
- address,
350
356
  amount,
351
357
  selectedValidators: targetValidators
352
358
  } = data;
@@ -360,11 +366,13 @@ class AstarNativeStakingPoolHandler extends _basePara.default {
360
366
  };
361
367
  const extrinsic = chainApi.api.tx.dappsStaking.bondAndStake(dappParam, binaryAmount);
362
368
  const tokenSlug = this.nativeToken.slug;
363
- const feeInfo = await extrinsic.paymentInfo(address);
364
- const fee = feeInfo.toPrimitive();
369
+ // const feeInfo = await extrinsic.paymentInfo(address);
370
+ // const fee = feeInfo.toPrimitive() as unknown as RuntimeDispatchInfo;
371
+
372
+ // Not use the fee to validate and to display on UI
365
373
  return [extrinsic, {
366
374
  slug: tokenSlug,
367
- amount: fee.partialFee.toString()
375
+ amount: '0'
368
376
  }];
369
377
  }
370
378
 
@@ -80,6 +80,9 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
80
80
  description: this.getDescription(minToHuman)
81
81
  },
82
82
  statistic: {
83
+ assetEarning: [{
84
+ slug: this.nativeToken.slug
85
+ }],
83
86
  maxCandidatePerFarmer: parseInt(maxDelegations),
84
87
  maxWithdrawalRequestPerFarmer: 1,
85
88
  // by default
@@ -295,20 +298,23 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
295
298
 
296
299
  async createJoinExtrinsic(data, positionInfo) {
297
300
  const {
298
- address,
299
301
  amount,
300
302
  selectedValidators
301
303
  } = data;
302
304
  const apiPromise = await this.substrateApi.isReady;
303
305
  const binaryAmount = new _util.BN(amount);
304
306
  const selectedCollatorInfo = selectedValidators[0];
307
+
308
+ // eslint-disable-next-line @typescript-eslint/require-await
305
309
  const compoundResult = async extrinsic => {
306
310
  const tokenSlug = this.nativeToken.slug;
307
- const feeInfo = await extrinsic.paymentInfo(address);
308
- const fee = feeInfo.toPrimitive();
311
+ // const feeInfo = await extrinsic.paymentInfo(address);
312
+ // const fee = feeInfo.toPrimitive() as unknown as RuntimeDispatchInfo;
313
+
314
+ // Not use the fee to validate and to display on UI
309
315
  return [extrinsic, {
310
316
  slug: tokenSlug,
311
- amount: fee.partialFee.toString()
317
+ amount: '0'
312
318
  }];
313
319
  };
314
320
  if (!positionInfo) {
@@ -80,6 +80,10 @@ class RelayNativeStakingPoolHandler extends _base.default {
80
80
  description: this.getDescription(minToHuman)
81
81
  },
82
82
  statistic: {
83
+ assetEarning: [{
84
+ slug: this.nativeToken.slug,
85
+ apy: expectedReturn
86
+ }],
83
87
  maxCandidatePerFarmer: parseInt(maxNominations),
84
88
  maxWithdrawalRequestPerFarmer: parseInt(maxUnlockingChunks),
85
89
  // TODO recheck
@@ -390,16 +394,21 @@ class RelayNativeStakingPoolHandler extends _base.default {
390
394
  const validatorParamList = targetValidators.map(validator => {
391
395
  return validator.address;
392
396
  });
397
+
398
+ // eslint-disable-next-line @typescript-eslint/require-await
393
399
  const compoundTransactions = async (bondTx, nominateTx) => {
394
400
  const extrinsic = chainApi.api.tx.utility.batchAll([bondTx, nominateTx]);
395
- const fees = await Promise.all([bondTx.paymentInfo(address), nominateTx.paymentInfo(address)]);
396
- const totalFee = fees.reduce((previousValue, currentItem) => {
397
- const fee = currentItem.toPrimitive();
398
- return previousValue + fee.partialFee;
399
- }, 0);
401
+ // const fees = await Promise.all([bondTx.paymentInfo(address), nominateTx.paymentInfo(address)]);
402
+ // const totalFee = fees.reduce((previousValue, currentItem) => {
403
+ // const fee = currentItem.toPrimitive() as unknown as RuntimeDispatchInfo;
404
+ //
405
+ // return previousValue + fee.partialFee;
406
+ // }, 0);
407
+
408
+ // Not use the fee to validate and to display on UI
400
409
  return [extrinsic, {
401
410
  slug: tokenSlug,
402
- amount: totalFee.toString()
411
+ amount: '0'
403
412
  }];
404
413
  };
405
414
  if (!positionInfo) {
@@ -429,18 +438,20 @@ class RelayNativeStakingPoolHandler extends _base.default {
429
438
  }
430
439
  }
431
440
  if (bondTx && !nominateTx) {
432
- const feeInfo = await bondTx.paymentInfo(address);
433
- const fee = feeInfo.toPrimitive();
441
+ // const feeInfo = await bondTx.paymentInfo(address);
442
+ // const fee = feeInfo.toPrimitive() as unknown as RuntimeDispatchInfo;
443
+
434
444
  return [bondTx, {
435
445
  slug: tokenSlug,
436
- amount: fee.partialFee.toString()
446
+ amount: '0'
437
447
  }];
438
448
  } else if (nominateTx && !bondTx) {
439
- const feeInfo = await nominateTx.paymentInfo(address);
440
- const fee = feeInfo.toPrimitive();
449
+ // const feeInfo = await nominateTx.paymentInfo(address);
450
+ // const fee = feeInfo.toPrimitive() as unknown as RuntimeDispatchInfo;
451
+
441
452
  return [nominateTx, {
442
453
  slug: tokenSlug,
443
- amount: fee.partialFee.toString()
454
+ amount: '0'
444
455
  }];
445
456
  }
446
457
  if (bondTx && nominateTx) {
@@ -95,6 +95,10 @@ class NominationPoolHandler extends _base.default {
95
95
  description: this.getDescription(minToHuman)
96
96
  },
97
97
  statistic: {
98
+ assetEarning: [{
99
+ slug: this.nativeToken.slug,
100
+ apy: expectedReturn
101
+ }],
98
102
  maxCandidatePerFarmer: 1,
99
103
  maxWithdrawalRequestPerFarmer: parseInt(maxUnlockingChunks),
100
104
  // TODO recheck
@@ -387,7 +391,6 @@ class NominationPoolHandler extends _base.default {
387
391
  }
388
392
  async createJoinExtrinsic(data, positionInfo) {
389
393
  const {
390
- address,
391
394
  amount,
392
395
  selectedPool: {
393
396
  id: selectedPoolId
@@ -395,13 +398,17 @@ class NominationPoolHandler extends _base.default {
395
398
  } = data;
396
399
  const chainApi = await this.substrateApi.isReady;
397
400
  const bnActiveStake = new _util.BN((positionInfo === null || positionInfo === void 0 ? void 0 : positionInfo.activeStake) || '0');
401
+
402
+ // eslint-disable-next-line @typescript-eslint/require-await
398
403
  const compoundResult = async extrinsic => {
399
404
  const tokenSlug = this.nativeToken.slug;
400
- const feeInfo = await extrinsic.paymentInfo(address);
401
- const fee = feeInfo.toPrimitive();
405
+ // const feeInfo = await extrinsic.paymentInfo(address);
406
+ // const fee = feeInfo.toPrimitive() as unknown as RuntimeDispatchInfo;
407
+
408
+ // Not use the fee to validate and to display on UI
402
409
  return [extrinsic, {
403
410
  slug: tokenSlug,
404
- amount: fee.partialFee.toString()
411
+ amount: '0'
405
412
  }];
406
413
  };
407
414
  if (bnActiveStake.gt(_util.BN_ZERO)) {
@@ -12,7 +12,6 @@ var _xcm = require("@subwallet/extension-base/koni/api/xcm");
12
12
  var _utils = require("@subwallet/extension-base/koni/api/yield/helper/utils");
13
13
  var _utils2 = require("@subwallet/extension-base/services/chain-service/utils");
14
14
  var _types = require("@subwallet/extension-base/types");
15
- var _bn = _interopRequireDefault(require("bn.js"));
16
15
  var _i18next = require("i18next");
17
16
  var _util = require("@polkadot/util");
18
17
  var _base = _interopRequireDefault(require("./base"));
@@ -37,7 +36,9 @@ class BaseSpecialStakingPoolHandler extends _base.default {
37
36
  shortName: this.shortName,
38
37
  name: this.name,
39
38
  isAvailable: true,
40
- allowCancelUnstaking: false
39
+ allowCancelUnstaking: false,
40
+ maintainAsset: this.nativeToken.slug,
41
+ maintainBalance: this.maintainBalance
41
42
  };
42
43
  }
43
44
  get isPoolSupportAlternativeFee() {
@@ -122,17 +123,17 @@ class BaseSpecialStakingPoolHandler extends _base.default {
122
123
  address,
123
124
  amount
124
125
  } = params;
125
- const bnAmount = new _bn.default(amount);
126
+ const bnAmount = new _util.BN(amount);
126
127
  const inputTokenSlug = this.inputAsset; // assume that the pool only has 1 input token, will update later
127
128
  const inputTokenInfo = this.state.getAssetBySlug(inputTokenSlug);
128
129
  const inputTokenBalance = await this.state.balanceService.getTokenFreeBalance(address, inputTokenInfo.originChain, inputTokenSlug);
129
- const bnInputTokenBalance = new _bn.default(inputTokenBalance.value);
130
+ const bnInputTokenBalance = new _util.BN(inputTokenBalance.value);
130
131
  if (!bnInputTokenBalance.gte(bnAmount)) {
131
132
  if (this.altInputAsset) {
132
133
  const altInputTokenSlug = this.altInputAsset;
133
134
  const altInputTokenInfo = this.state.getAssetBySlug(altInputTokenSlug);
134
135
  const altInputTokenBalance = await this.state.balanceService.getTokenFreeBalance(address, altInputTokenInfo.originChain, altInputTokenSlug);
135
- const bnAltInputTokenBalance = new _bn.default(altInputTokenBalance.value || '0');
136
+ const bnAltInputTokenBalance = new _util.BN(altInputTokenBalance.value || '0');
136
137
  if (bnAltInputTokenBalance.gt(_util.BN_ZERO)) {
137
138
  const step = {
138
139
  metadata: {
@@ -197,15 +198,15 @@ class BaseSpecialStakingPoolHandler extends _base.default {
197
198
  ok: true,
198
199
  status: _types.YieldValidationStatus.OK
199
200
  };
200
- const bnAmount = new _bn.default(params.amount);
201
+ const bnAmount = new _util.BN(params.amount);
201
202
  const altInputTokenSlug = this.altInputAsset || '';
202
203
  const altInputTokenInfo = this.state.getAssetBySlug(altInputTokenSlug);
203
204
  const altInputTokenBalance = await this.state.balanceService.getTokenFreeBalance(params.address, altInputTokenInfo.originChain, altInputTokenSlug);
204
205
  const missingAmount = bnAmount.sub(bnInputTokenBalance); // TODO: what if input token is not LOCAL ??
205
- const xcmFee = new _bn.default(path.totalFee[1].amount || '0');
206
+ const xcmFee = new _util.BN(path.totalFee[1].amount || '0');
206
207
  const xcmAmount = missingAmount.add(xcmFee);
207
- const bnAltInputTokenBalance = new _bn.default(altInputTokenBalance.value || '0');
208
- const altInputTokenMinAmount = new _bn.default(altInputTokenInfo.minAmount || '0');
208
+ const bnAltInputTokenBalance = new _util.BN(altInputTokenBalance.value || '0');
209
+ const altInputTokenMinAmount = new _util.BN(altInputTokenInfo.minAmount || '0');
209
210
  if (!bnAltInputTokenBalance.sub(xcmAmount).gte(altInputTokenMinAmount)) {
210
211
  processValidation.failedStep = path.steps[1];
211
212
  processValidation.ok = false;
@@ -230,13 +231,13 @@ class BaseSpecialStakingPoolHandler extends _base.default {
230
231
  const feeTokenSlug = path.totalFee[id].slug;
231
232
  const feeTokenInfo = this.state.getAssetBySlug(feeTokenSlug);
232
233
  const defaultFeeTokenSlug = this.feeAssets[0];
233
- const bnAmount = new _bn.default(params.amount);
234
+ const bnAmount = new _util.BN(params.amount);
234
235
  if (this.feeAssets.length === 1 && feeTokenSlug === defaultFeeTokenSlug) {
235
236
  var _path$totalFee$id;
236
- const bnFeeAmount = new _bn.default(((_path$totalFee$id = path.totalFee[id]) === null || _path$totalFee$id === void 0 ? void 0 : _path$totalFee$id.amount) || '0');
237
+ const bnFeeAmount = new _util.BN(((_path$totalFee$id = path.totalFee[id]) === null || _path$totalFee$id === void 0 ? void 0 : _path$totalFee$id.amount) || '0');
237
238
  const feeTokenBalance = await this.state.balanceService.getTokenFreeBalance(params.address, feeTokenInfo.originChain, feeTokenSlug);
238
- const bnFeeTokenBalance = new _bn.default(feeTokenBalance.value || '0');
239
- const bnFeeTokenMinAmount = new _bn.default((feeTokenInfo === null || feeTokenInfo === void 0 ? void 0 : feeTokenInfo.minAmount) || '0');
239
+ const bnFeeTokenBalance = new _util.BN(feeTokenBalance.value || '0');
240
+ const bnFeeTokenMinAmount = new _util.BN((feeTokenInfo === null || feeTokenInfo === void 0 ? void 0 : feeTokenInfo.minAmount) || '0');
240
241
  if (!bnFeeTokenBalance.sub(bnFeeAmount).gte(bnFeeTokenMinAmount)) {
241
242
  processValidation.failedStep = path.steps[id];
242
243
  processValidation.ok = false;
@@ -244,7 +245,7 @@ class BaseSpecialStakingPoolHandler extends _base.default {
244
245
  return [new _TransactionError.TransactionError(_types.YieldValidationStatus.NOT_ENOUGH_FEE, processValidation.message, processValidation)];
245
246
  }
246
247
  }
247
- if (!bnAmount.gte(new _bn.default(poolInfo.statistic.minJoinPool || '0'))) {
248
+ if (!bnAmount.gte(new _util.BN(poolInfo.statistic.minJoinPool || '0'))) {
248
249
  processValidation.failedStep = path.steps[id];
249
250
  processValidation.ok = false;
250
251
  processValidation.status = _types.YieldValidationStatus.NOT_ENOUGH_MIN_JOIN_POOL;
@@ -263,7 +264,7 @@ class BaseSpecialStakingPoolHandler extends _base.default {
263
264
  const inputTokenInfo = this.state.getAssetBySlug(inputTokenSlug);
264
265
  const balanceService = this.state.balanceService;
265
266
  const inputTokenBalance = await balanceService.getTokenFreeBalance(params.address, inputTokenInfo.originChain, inputTokenSlug);
266
- const bnInputTokenBalance = new _bn.default(inputTokenBalance.value || '0');
267
+ const bnInputTokenBalance = new _util.BN(inputTokenBalance.value || '0');
267
268
  let isXcmOk = false;
268
269
  for (const step of path.steps) {
269
270
  const getErrors = async () => {
@@ -307,9 +308,9 @@ class BaseSpecialStakingPoolHandler extends _base.default {
307
308
  const destinationTokenInfo = this.state.getAssetBySlug(destinationTokenSlug);
308
309
  const substrateApi = this.state.getSubstrateApi(originChainInfo.slug);
309
310
  const inputTokenBalance = await this.state.balanceService.getTokenFreeBalance(address, destinationTokenInfo.originChain, destinationTokenSlug);
310
- const bnInputTokenBalance = new _bn.default(inputTokenBalance.value);
311
- const bnXcmFee = new _bn.default(xcmFee);
312
- const bnAmount = new _bn.default(amount);
311
+ const bnInputTokenBalance = new _util.BN(inputTokenBalance.value);
312
+ const bnXcmFee = new _util.BN(xcmFee);
313
+ const bnAmount = new _util.BN(amount);
313
314
  const bnTotalAmount = bnAmount.sub(bnInputTokenBalance).add(bnXcmFee);
314
315
  const extrinsic = await (0, _xcm.createXcmExtrinsic)({
315
316
  chainInfoMap: this.state.getChainInfoMap(),
@@ -372,9 +373,9 @@ class BaseSpecialStakingPoolHandler extends _base.default {
372
373
  return [new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR)];
373
374
  }
374
375
  const errors = [];
375
- const bnActiveStake = new _bn.default(poolPosition.activeStake);
376
- const bnRemainingStake = bnActiveStake.sub(new _bn.default(amount));
377
- const minStake = new _bn.default(poolInfo.statistic.minJoinPool || '0');
376
+ const bnActiveStake = new _util.BN(poolPosition.activeStake);
377
+ const bnRemainingStake = bnActiveStake.sub(new _util.BN(amount));
378
+ const minStake = new _util.BN(poolInfo.statistic.minJoinPool || '0');
378
379
  const maxUnstake = poolInfo.statistic.maxWithdrawalRequestPerFarmer;
379
380
  if (!(bnRemainingStake.isZero() || bnRemainingStake.gte(minStake))) {
380
381
  errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.INVALID_ACTIVE_STAKE));
package/package.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "./cjs/detectPackage.js"
18
18
  ],
19
19
  "type": "module",
20
- "version": "1.1.28-beta.3",
20
+ "version": "1.1.29-beta.0",
21
21
  "main": "./cjs/index.js",
22
22
  "module": "./index.js",
23
23
  "types": "./index.d.ts",
@@ -1695,11 +1695,11 @@
1695
1695
  "@reduxjs/toolkit": "^1.9.1",
1696
1696
  "@sora-substrate/type-definitions": "^1.17.7",
1697
1697
  "@substrate/connect": "^0.7.26",
1698
- "@subwallet/chain-list": "0.2.32",
1699
- "@subwallet/extension-base": "^1.1.28-1",
1700
- "@subwallet/extension-chains": "^1.1.28-1",
1701
- "@subwallet/extension-dapp": "^1.1.28-1",
1702
- "@subwallet/extension-inject": "^1.1.28-1",
1698
+ "@subwallet/chain-list": "0.2.33",
1699
+ "@subwallet/extension-base": "^1.1.29-0",
1700
+ "@subwallet/extension-chains": "^1.1.29-0",
1701
+ "@subwallet/extension-dapp": "^1.1.29-0",
1702
+ "@subwallet/extension-inject": "^1.1.29-0",
1703
1703
  "@subwallet/keyring": "^0.1.1",
1704
1704
  "@subwallet/ui-keyring": "^0.1.1",
1705
1705
  "@walletconnect/sign-client": "^2.8.4",
package/packageInfo.js CHANGED
@@ -7,5 +7,5 @@ export const packageInfo = {
7
7
  name: '@subwallet/extension-base',
8
8
  path: (import.meta && import.meta.url) ? new URL(import.meta.url).pathname.substring(0, new URL(import.meta.url).pathname.lastIndexOf('/') + 1) : 'auto',
9
9
  type: 'esm',
10
- version: '1.1.28-1'
10
+ version: '1.1.29-0'
11
11
  };
@@ -40,6 +40,7 @@ export default abstract class BasePoolHandler {
40
40
  protected get nativeToken(): _ChainAsset;
41
41
  protected get baseInfo(): Omit<BasePoolInfo, 'type'>;
42
42
  protected abstract getDescription(amount?: string): string;
43
+ protected get maintainBalance(): string;
43
44
  protected get metadataInfo(): Omit<BaseYieldPoolMetadata, 'description'>;
44
45
  /** Can mint when haven't enough native token (use input token for fee) */
45
46
  get isPoolSupportAlternativeFee(): boolean;
@@ -3,6 +3,8 @@
3
3
 
4
4
  import { ChainType } from '@subwallet/extension-base/background/KoniTypes';
5
5
  import { DEFAULT_YIELD_FIRST_STEP } from '@subwallet/extension-base/services/earning-service/constants';
6
+ import { BN, BN_TEN } from '@polkadot/util';
7
+
6
8
  /**
7
9
  * @class BasePoolHandler
8
10
  * @description Base pool handler
@@ -64,6 +66,13 @@ export default class BasePoolHandler {
64
66
  slug: this.slug
65
67
  };
66
68
  }
69
+ get maintainBalance() {
70
+ const decimals = this.nativeToken.decimals || 0;
71
+ const defaultMaintainBalance = new BN(1).mul(BN_TEN.pow(new BN(decimals)));
72
+ const ed = new BN(this.nativeToken.minAmount || '0');
73
+ const maintainBalance = ed.gt(defaultMaintainBalance) ? ed.mul(new BN(1.5)) : defaultMaintainBalance;
74
+ return maintainBalance.toString();
75
+ }
67
76
  get metadataInfo() {
68
77
  return {
69
78
  name: this.name,
@@ -71,7 +80,9 @@ export default class BasePoolHandler {
71
80
  logo: this.logo,
72
81
  inputAsset: this.nativeToken.slug,
73
82
  isAvailable: true,
74
- allowCancelUnstaking: false
83
+ allowCancelUnstaking: false,
84
+ maintainAsset: this.nativeToken.slug,
85
+ maintainBalance: this.maintainBalance
75
86
  };
76
87
  }
77
88
 
@@ -5,8 +5,7 @@ import { TransactionError } from '@subwallet/extension-base/background/errors/Tr
5
5
  import { BasicTxErrorType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
6
6
  import { _getTokenOnChainInfo } from '@subwallet/extension-base/services/chain-service/utils';
7
7
  import { EarningStatus, YieldStepType } from '@subwallet/extension-base/types';
8
- import BN from 'bn.js';
9
- import { BN_ZERO } from '@polkadot/util';
8
+ import { BN, BN_ZERO } from '@polkadot/util';
10
9
  import { fakeAddress } from "../../constants/index.js";
11
10
  import BaseLendingPoolHandler from "./base.js";
12
11
  export default class InterlayLendingPoolHandler extends BaseLendingPoolHandler {
@@ -117,12 +116,19 @@ export default class InterlayLendingPoolHandler extends BaseLendingPoolHandler {
117
116
  const inputTokenSlug = this.inputAsset;
118
117
  const inputTokenInfo = this.state.getAssetBySlug(inputTokenSlug);
119
118
  const defaultFeeTokenSlug = this.feeAssets[0];
120
- const _mintFeeInfo = await poolOriginSubstrateApi.api.tx.loans.mint(_getTokenOnChainInfo(inputTokenInfo), params.amount).paymentInfo(fakeAddress);
121
- const mintFeeInfo = _mintFeeInfo.toPrimitive();
122
- return {
123
- amount: mintFeeInfo.partialFee.toString(),
124
- slug: defaultFeeTokenSlug
125
- };
119
+ if (new BN(params.amount).gt(BN_ZERO)) {
120
+ const _mintFeeInfo = await poolOriginSubstrateApi.api.tx.loans.mint(_getTokenOnChainInfo(inputTokenInfo), params.amount).paymentInfo(fakeAddress);
121
+ const mintFeeInfo = _mintFeeInfo.toPrimitive();
122
+ return {
123
+ amount: mintFeeInfo.partialFee.toString(),
124
+ slug: defaultFeeTokenSlug
125
+ };
126
+ } else {
127
+ return {
128
+ amount: '0',
129
+ slug: defaultFeeTokenSlug
130
+ };
131
+ }
126
132
  }
127
133
  async handleSubmitStep(data, path) {
128
134
  const substrateApi = await this.substrateApi.isReady;
@@ -72,6 +72,7 @@ export default class AcalaLiquidStakingPoolHandler extends BaseLiquidStakingPool
72
72
  apy: apy * 100,
73
73
  exchangeRate: latestExchangeRate / decimals
74
74
  }],
75
+ unstakingPeriod: 24 * 28,
75
76
  maxCandidatePerFarmer: 1,
76
77
  maxWithdrawalRequestPerFarmer: 1,
77
78
  minJoinPool: '50000000000',
@@ -139,12 +140,19 @@ export default class AcalaLiquidStakingPoolHandler extends BaseLiquidStakingPool
139
140
  async getSubmitStepFee(params) {
140
141
  const poolOriginSubstrateApi = await this.substrateApi.isReady;
141
142
  const defaultFeeTokenSlug = this.feeAssets[0];
142
- const _mintFeeInfo = await poolOriginSubstrateApi.api.tx.homa.mint(params.amount).paymentInfo(fakeAddress);
143
- const mintFeeInfo = _mintFeeInfo.toPrimitive();
144
- return {
145
- amount: mintFeeInfo.partialFee.toString(),
146
- slug: defaultFeeTokenSlug
147
- };
143
+ if (new BN(params.amount).gt(BN_ZERO)) {
144
+ const _mintFeeInfo = await poolOriginSubstrateApi.api.tx.homa.mint(params.amount).paymentInfo(fakeAddress);
145
+ const mintFeeInfo = _mintFeeInfo.toPrimitive();
146
+ return {
147
+ amount: mintFeeInfo.partialFee.toString(),
148
+ slug: defaultFeeTokenSlug
149
+ };
150
+ } else {
151
+ return {
152
+ amount: '0',
153
+ slug: defaultFeeTokenSlug
154
+ };
155
+ }
148
156
  }
149
157
  async handleSubmitStep(data, path) {
150
158
  const substrateApi = await this.substrateApi.isReady;
@@ -74,6 +74,7 @@ export default class BifrostLiquidStakingPoolHandler extends BaseLiquidStakingPo
74
74
  apy: parseFloat(vDOTStats.apyBase),
75
75
  exchangeRate: parseFloat(exchangeRate.data.slp_polkadot_ratio[0].ratio)
76
76
  }],
77
+ unstakingPeriod: 24 * 28,
77
78
  maxCandidatePerFarmer: 1,
78
79
  maxWithdrawalRequestPerFarmer: 1,
79
80
  minJoinPool: '5000000000',
@@ -212,12 +213,19 @@ export default class BifrostLiquidStakingPoolHandler extends BaseLiquidStakingPo
212
213
  const inputTokenSlug = this.inputAsset;
213
214
  const inputTokenInfo = this.state.getAssetBySlug(inputTokenSlug);
214
215
  const defaultFeeTokenSlug = this.feeAssets[0];
215
- const _mintFeeInfo = await poolOriginSubstrateApi.api.tx.vtokenMinting.mint(_getTokenOnChainInfo(inputTokenInfo), params.amount, null).paymentInfo(fakeAddress);
216
- const mintFeeInfo = _mintFeeInfo.toPrimitive();
217
- return {
218
- amount: mintFeeInfo.partialFee.toString(),
219
- slug: defaultFeeTokenSlug
220
- };
216
+ if (new BN(params.amount).gt(BN_ZERO)) {
217
+ const _mintFeeInfo = await poolOriginSubstrateApi.api.tx.vtokenMinting.mint(_getTokenOnChainInfo(inputTokenInfo), params.amount, null).paymentInfo(fakeAddress);
218
+ const mintFeeInfo = _mintFeeInfo.toPrimitive();
219
+ return {
220
+ amount: mintFeeInfo.partialFee.toString(),
221
+ slug: defaultFeeTokenSlug
222
+ };
223
+ } else {
224
+ return {
225
+ amount: '0',
226
+ slug: defaultFeeTokenSlug
227
+ };
228
+ }
221
229
  }
222
230
  async handleSubmitStep(data, path) {
223
231
  const substrateApi = await this.substrateApi.isReady;
@@ -63,6 +63,7 @@ export default class ParallelLiquidStakingPoolHandler extends BaseLiquidStakingP
63
63
  apy: apy * 100,
64
64
  exchangeRate: exchangeRate / decimals
65
65
  }],
66
+ unstakingPeriod: 24 * 28,
66
67
  maxCandidatePerFarmer: 1,
67
68
  maxWithdrawalRequestPerFarmer: 1,
68
69
  minJoinPool: '10000000000',
@@ -135,12 +136,19 @@ export default class ParallelLiquidStakingPoolHandler extends BaseLiquidStakingP
135
136
  async getSubmitStepFee(params) {
136
137
  const poolOriginSubstrateApi = await this.substrateApi.isReady;
137
138
  const defaultFeeTokenSlug = this.feeAssets[0];
138
- const _mintFeeInfo = await poolOriginSubstrateApi.api.tx.liquidStaking.stake(params.amount).paymentInfo(fakeAddress);
139
- const mintFeeInfo = _mintFeeInfo.toPrimitive();
140
- return {
141
- amount: mintFeeInfo.partialFee.toString(),
142
- slug: defaultFeeTokenSlug
143
- };
139
+ if (new BN(params.amount).gt(BN_ZERO)) {
140
+ const _mintFeeInfo = await poolOriginSubstrateApi.api.tx.liquidStaking.stake(params.amount).paymentInfo(fakeAddress);
141
+ const mintFeeInfo = _mintFeeInfo.toPrimitive();
142
+ return {
143
+ amount: mintFeeInfo.partialFee.toString(),
144
+ slug: defaultFeeTokenSlug
145
+ };
146
+ } else {
147
+ return {
148
+ amount: '0',
149
+ slug: defaultFeeTokenSlug
150
+ };
151
+ }
144
152
  }
145
153
  async handleSubmitStep(data, path) {
146
154
  const substrateApi = await this.substrateApi.isReady;
@@ -6,9 +6,8 @@ import { BasicTxErrorType, ChainType, ExtrinsicType } from '@subwallet/extension
6
6
  import { getERC20Contract } from '@subwallet/extension-base/koni/api/tokens/evm/web3';
7
7
  import { _getAssetDecimals, _getContractAddressOfToken } from '@subwallet/extension-base/services/chain-service/utils';
8
8
  import { EarningStatus, UnstakingStatus, YieldStepType } from '@subwallet/extension-base/types';
9
- import { BN } from 'bn.js';
10
9
  import fetch from 'cross-fetch';
11
- import { BN_ZERO } from '@polkadot/util';
10
+ import { BN, BN_ZERO } from '@polkadot/util';
12
11
  import { DEFAULT_YIELD_FIRST_STEP, ST_LIQUID_TOKEN_ABI } from "../../constants/index.js";
13
12
  import BaseLiquidStakingPoolHandler from "./base.js";
14
13
  export const getStellaswapLiquidStakingContract = (networkKey, assetAddress, evmApi, options = {}) => {
@@ -81,6 +80,7 @@ export default class StellaSwapLiquidStakingPoolHandler extends BaseLiquidStakin
81
80
  apr: aprObject.result,
82
81
  exchangeRate: exchangeRate
83
82
  }],
83
+ unstakingPeriod: 24 * 28,
84
84
  maxCandidatePerFarmer: 1,
85
85
  maxWithdrawalRequestPerFarmer: 1,
86
86
  minJoinPool: '0',
@@ -205,18 +205,25 @@ export default class StellaSwapLiquidStakingPoolHandler extends BaseLiquidStakin
205
205
  const evmApi = this.evmApi;
206
206
  const derivativeTokenSlug = this.derivativeAssets[0];
207
207
  const derivativeTokenInfo = this.state.getAssetBySlug(derivativeTokenSlug);
208
- const stakingContract = getStellaswapLiquidStakingContract(this.chain, _getContractAddressOfToken(derivativeTokenInfo), evmApi);
208
+ if (new BN(params.amount).gt(BN_ZERO)) {
209
+ const stakingContract = getStellaswapLiquidStakingContract(this.chain, _getContractAddressOfToken(derivativeTokenInfo), evmApi);
209
210
 
210
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
211
- const depositCall = stakingContract.methods.deposit(params.amount);
211
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
212
+ const depositCall = stakingContract.methods.deposit(params.amount);
212
213
 
213
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
214
- const estimatedDepositGas = await depositCall.estimateGas();
215
- const gasPrice = await evmApi.api.eth.getGasPrice();
216
- return {
217
- slug: this.feeAssets[0],
218
- amount: (estimatedDepositGas * parseInt(gasPrice)).toString()
219
- };
214
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
215
+ const estimatedDepositGas = await depositCall.estimateGas();
216
+ const gasPrice = await evmApi.api.eth.getGasPrice();
217
+ return {
218
+ slug: this.feeAssets[0],
219
+ amount: (estimatedDepositGas * parseInt(gasPrice)).toString()
220
+ };
221
+ } else {
222
+ return {
223
+ slug: this.feeAssets[0],
224
+ amount: '0'
225
+ };
226
+ }
220
227
  }
221
228
  async generateOptimalPath(params) {
222
229
  const result = {
@@ -60,6 +60,9 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
60
60
  description: this.getDescription(minToHuman)
61
61
  },
62
62
  statistic: {
63
+ assetEarning: [{
64
+ slug: this.nativeToken.slug
65
+ }],
63
66
  maxCandidatePerFarmer: parseInt(maxDelegations),
64
67
  maxWithdrawalRequestPerFarmer: 1,
65
68
  // by default
@@ -280,13 +283,17 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
280
283
  const binaryAmount = new BN(amount);
281
284
  const poolPosition = await this.getPoolPosition(address);
282
285
  const selectedValidatorInfo = targetValidators[0];
286
+
287
+ // eslint-disable-next-line @typescript-eslint/require-await
283
288
  const compoundResult = async extrinsic => {
284
289
  const tokenSlug = this.nativeToken.slug;
285
- const feeInfo = await extrinsic.paymentInfo(address);
286
- const fee = feeInfo.toPrimitive();
290
+ // const feeInfo = await extrinsic.paymentInfo(address);
291
+ // const fee = feeInfo.toPrimitive() as unknown as RuntimeDispatchInfo;
292
+
293
+ // Not use the fee to validate and to display on UI
287
294
  return [extrinsic, {
288
295
  slug: tokenSlug,
289
- amount: fee.partialFee.toString()
296
+ amount: '0'
290
297
  }];
291
298
  };
292
299
  if (!poolPosition) {
@@ -66,7 +66,10 @@ export default class AstarNativeStakingPoolHandler extends BaseParaNativeStaking
66
66
  method: 'GET'
67
67
  }).then(resp => {
68
68
  resolve(resp.json());
69
- }).catch(console.error);
69
+ }).catch(e => {
70
+ console.error(e);
71
+ resolve(null);
72
+ });
70
73
  });
71
74
  const timeout = new Promise(resolve => {
72
75
  const id = setTimeout(() => {
@@ -102,6 +105,10 @@ export default class AstarNativeStakingPoolHandler extends BaseParaNativeStaking
102
105
  description: this.getDescription(minToHuman)
103
106
  },
104
107
  statistic: {
108
+ assetEarning: [{
109
+ slug: this.nativeToken.slug,
110
+ apy: apyInfo !== null ? apyInfo : undefined
111
+ }],
105
112
  maxCandidatePerFarmer: 100,
106
113
  // temporary fix for Astar, there's no limit for now
107
114
  maxWithdrawalRequestPerFarmer: 1,
@@ -337,7 +344,6 @@ export default class AstarNativeStakingPoolHandler extends BaseParaNativeStaking
337
344
  }
338
345
  async createJoinExtrinsic(data, positionInfo, bondDest = 'Staked') {
339
346
  const {
340
- address,
341
347
  amount,
342
348
  selectedValidators: targetValidators
343
349
  } = data;
@@ -351,11 +357,13 @@ export default class AstarNativeStakingPoolHandler extends BaseParaNativeStaking
351
357
  };
352
358
  const extrinsic = chainApi.api.tx.dappsStaking.bondAndStake(dappParam, binaryAmount);
353
359
  const tokenSlug = this.nativeToken.slug;
354
- const feeInfo = await extrinsic.paymentInfo(address);
355
- const fee = feeInfo.toPrimitive();
360
+ // const feeInfo = await extrinsic.paymentInfo(address);
361
+ // const fee = feeInfo.toPrimitive() as unknown as RuntimeDispatchInfo;
362
+
363
+ // Not use the fee to validate and to display on UI
356
364
  return [extrinsic, {
357
365
  slug: tokenSlug,
358
- amount: fee.partialFee.toString()
366
+ amount: '0'
359
367
  }];
360
368
  }
361
369
 
@@ -73,6 +73,9 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
73
73
  description: this.getDescription(minToHuman)
74
74
  },
75
75
  statistic: {
76
+ assetEarning: [{
77
+ slug: this.nativeToken.slug
78
+ }],
76
79
  maxCandidatePerFarmer: parseInt(maxDelegations),
77
80
  maxWithdrawalRequestPerFarmer: 1,
78
81
  // by default
@@ -288,20 +291,23 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
288
291
 
289
292
  async createJoinExtrinsic(data, positionInfo) {
290
293
  const {
291
- address,
292
294
  amount,
293
295
  selectedValidators
294
296
  } = data;
295
297
  const apiPromise = await this.substrateApi.isReady;
296
298
  const binaryAmount = new BN(amount);
297
299
  const selectedCollatorInfo = selectedValidators[0];
300
+
301
+ // eslint-disable-next-line @typescript-eslint/require-await
298
302
  const compoundResult = async extrinsic => {
299
303
  const tokenSlug = this.nativeToken.slug;
300
- const feeInfo = await extrinsic.paymentInfo(address);
301
- const fee = feeInfo.toPrimitive();
304
+ // const feeInfo = await extrinsic.paymentInfo(address);
305
+ // const fee = feeInfo.toPrimitive() as unknown as RuntimeDispatchInfo;
306
+
307
+ // Not use the fee to validate and to display on UI
302
308
  return [extrinsic, {
303
309
  slug: tokenSlug,
304
- amount: fee.partialFee.toString()
310
+ amount: '0'
305
311
  }];
306
312
  };
307
313
  if (!positionInfo) {
@@ -73,6 +73,10 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
73
73
  description: this.getDescription(minToHuman)
74
74
  },
75
75
  statistic: {
76
+ assetEarning: [{
77
+ slug: this.nativeToken.slug,
78
+ apy: expectedReturn
79
+ }],
76
80
  maxCandidatePerFarmer: parseInt(maxNominations),
77
81
  maxWithdrawalRequestPerFarmer: parseInt(maxUnlockingChunks),
78
82
  // TODO recheck
@@ -382,16 +386,21 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
382
386
  const validatorParamList = targetValidators.map(validator => {
383
387
  return validator.address;
384
388
  });
389
+
390
+ // eslint-disable-next-line @typescript-eslint/require-await
385
391
  const compoundTransactions = async (bondTx, nominateTx) => {
386
392
  const extrinsic = chainApi.api.tx.utility.batchAll([bondTx, nominateTx]);
387
- const fees = await Promise.all([bondTx.paymentInfo(address), nominateTx.paymentInfo(address)]);
388
- const totalFee = fees.reduce((previousValue, currentItem) => {
389
- const fee = currentItem.toPrimitive();
390
- return previousValue + fee.partialFee;
391
- }, 0);
393
+ // const fees = await Promise.all([bondTx.paymentInfo(address), nominateTx.paymentInfo(address)]);
394
+ // const totalFee = fees.reduce((previousValue, currentItem) => {
395
+ // const fee = currentItem.toPrimitive() as unknown as RuntimeDispatchInfo;
396
+ //
397
+ // return previousValue + fee.partialFee;
398
+ // }, 0);
399
+
400
+ // Not use the fee to validate and to display on UI
392
401
  return [extrinsic, {
393
402
  slug: tokenSlug,
394
- amount: totalFee.toString()
403
+ amount: '0'
395
404
  }];
396
405
  };
397
406
  if (!positionInfo) {
@@ -421,18 +430,20 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
421
430
  }
422
431
  }
423
432
  if (bondTx && !nominateTx) {
424
- const feeInfo = await bondTx.paymentInfo(address);
425
- const fee = feeInfo.toPrimitive();
433
+ // const feeInfo = await bondTx.paymentInfo(address);
434
+ // const fee = feeInfo.toPrimitive() as unknown as RuntimeDispatchInfo;
435
+
426
436
  return [bondTx, {
427
437
  slug: tokenSlug,
428
- amount: fee.partialFee.toString()
438
+ amount: '0'
429
439
  }];
430
440
  } else if (nominateTx && !bondTx) {
431
- const feeInfo = await nominateTx.paymentInfo(address);
432
- const fee = feeInfo.toPrimitive();
441
+ // const feeInfo = await nominateTx.paymentInfo(address);
442
+ // const fee = feeInfo.toPrimitive() as unknown as RuntimeDispatchInfo;
443
+
433
444
  return [nominateTx, {
434
445
  slug: tokenSlug,
435
- amount: fee.partialFee.toString()
446
+ amount: '0'
436
447
  }];
437
448
  }
438
449
  if (bondTx && nominateTx) {
@@ -87,6 +87,10 @@ export default class NominationPoolHandler extends BasePoolHandler {
87
87
  description: this.getDescription(minToHuman)
88
88
  },
89
89
  statistic: {
90
+ assetEarning: [{
91
+ slug: this.nativeToken.slug,
92
+ apy: expectedReturn
93
+ }],
90
94
  maxCandidatePerFarmer: 1,
91
95
  maxWithdrawalRequestPerFarmer: parseInt(maxUnlockingChunks),
92
96
  // TODO recheck
@@ -378,7 +382,6 @@ export default class NominationPoolHandler extends BasePoolHandler {
378
382
  }
379
383
  async createJoinExtrinsic(data, positionInfo) {
380
384
  const {
381
- address,
382
385
  amount,
383
386
  selectedPool: {
384
387
  id: selectedPoolId
@@ -386,13 +389,17 @@ export default class NominationPoolHandler extends BasePoolHandler {
386
389
  } = data;
387
390
  const chainApi = await this.substrateApi.isReady;
388
391
  const bnActiveStake = new BN((positionInfo === null || positionInfo === void 0 ? void 0 : positionInfo.activeStake) || '0');
392
+
393
+ // eslint-disable-next-line @typescript-eslint/require-await
389
394
  const compoundResult = async extrinsic => {
390
395
  const tokenSlug = this.nativeToken.slug;
391
- const feeInfo = await extrinsic.paymentInfo(address);
392
- const fee = feeInfo.toPrimitive();
396
+ // const feeInfo = await extrinsic.paymentInfo(address);
397
+ // const fee = feeInfo.toPrimitive() as unknown as RuntimeDispatchInfo;
398
+
399
+ // Not use the fee to validate and to display on UI
393
400
  return [extrinsic, {
394
401
  slug: tokenSlug,
395
- amount: fee.partialFee.toString()
402
+ amount: '0'
396
403
  }];
397
404
  };
398
405
  if (bnActiveStake.gt(BN_ZERO)) {
@@ -1,7 +1,8 @@
1
+ /// <reference types="bn.js" />
1
2
  import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
2
3
  import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
3
4
  import { BaseYieldStepDetail, HandleYieldStepData, OptimalYieldPath, OptimalYieldPathParams, SpecialYieldPoolInfo, SpecialYieldPoolMetadata, SubmitYieldJoinData, TransactionData, UnstakingInfo, YieldPoolInfo, YieldPoolTarget, YieldPoolType, YieldStepBaseInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
4
- import BN from 'bn.js';
5
+ import { BN } from '@polkadot/util';
5
6
  import BasePoolHandler from './base';
6
7
  export default abstract class BaseSpecialStakingPoolHandler extends BasePoolHandler {
7
8
  protected abstract altInputAsset: string;
@@ -8,9 +8,8 @@ import { createXcmExtrinsic } from '@subwallet/extension-base/koni/api/xcm';
8
8
  import { YIELD_POOL_STAT_REFRESH_INTERVAL } from '@subwallet/extension-base/koni/api/yield/helper/utils';
9
9
  import { _getChainNativeTokenSlug } from '@subwallet/extension-base/services/chain-service/utils';
10
10
  import { YieldStepType, YieldValidationStatus } from '@subwallet/extension-base/types';
11
- import BN from 'bn.js';
12
11
  import { t } from 'i18next';
13
- import { BN_ZERO, noop } from '@polkadot/util';
12
+ import { BN, BN_ZERO, noop } from '@polkadot/util';
14
13
  import BasePoolHandler from "./base.js";
15
14
  export default class BaseSpecialStakingPoolHandler extends BasePoolHandler {
16
15
  /** Pool's type */
@@ -30,7 +29,9 @@ export default class BaseSpecialStakingPoolHandler extends BasePoolHandler {
30
29
  shortName: this.shortName,
31
30
  name: this.name,
32
31
  isAvailable: true,
33
- allowCancelUnstaking: false
32
+ allowCancelUnstaking: false,
33
+ maintainAsset: this.nativeToken.slug,
34
+ maintainBalance: this.maintainBalance
34
35
  };
35
36
  }
36
37
  get isPoolSupportAlternativeFee() {
@@ -28,6 +28,8 @@ export interface YieldAssetEarningStats {
28
28
  * @prop {boolean} isAvailable - Is the pool available?
29
29
  * @prop {string} inputAsset - Input token (slug)
30
30
  * @prop {boolean} allowCancelUnstaking - Allow canceling un-stake
31
+ * @prop {string} maintainAsset - Asset to maintain account's pool
32
+ * @prop {string} maintainBalance - Balance to maintain account's pool
31
33
  * */
32
34
  export interface BaseYieldPoolMetadata {
33
35
  /** Pool's description */
@@ -44,6 +46,10 @@ export interface BaseYieldPoolMetadata {
44
46
  isAvailable: boolean;
45
47
  /** Allow to cancel un-stake */
46
48
  allowCancelUnstaking: boolean;
49
+ /** Asset to maintain account's pool */
50
+ maintainAsset: string;
51
+ /** Balance to maintain account's pool */
52
+ maintainBalance: string;
47
53
  }
48
54
  /**
49
55
  * @interface NormalYieldPoolMetadata
@@ -80,6 +86,7 @@ export declare type YieldPoolMetadata = NormalYieldPoolMetadata | SpecialYieldPo
80
86
  /**
81
87
  * @interface BaseYieldPoolStatistic
82
88
  * @description Statistic data of pool
89
+ * @prop {YieldAssetEarningStats[]} assetEarning - Info for asset earning
83
90
  * @prop {number} maxCandidatePerFarmer - Max candidates per farmer
84
91
  * @prop {number} maxWithdrawalRequestPerFarmer - Max withdrawal request per farmer
85
92
  * @prop {string} minJoinPool - Min amount to join pool
@@ -89,6 +96,8 @@ export declare type YieldPoolMetadata = NormalYieldPoolMetadata | SpecialYieldPo
89
96
  * @prop {number} [totalApr] - Total apr of earning assets
90
97
  * */
91
98
  export interface BaseYieldPoolStatistic {
99
+ /** Info for asset earning */
100
+ assetEarning: YieldAssetEarningStats[];
92
101
  /** Max candidate per farmer */
93
102
  maxCandidatePerFarmer: number;
94
103
  /** Max withdrawal request per farmer */
@@ -122,14 +131,14 @@ export interface NormalYieldPoolStatistic extends BaseYieldPoolStatistic {
122
131
  /**
123
132
  * @interface SpecialYieldPoolStatistic
124
133
  * @extends BaseYieldPoolStatistic
125
- * @prop {YieldAssetEarningStats[]} assetEarning - Info for asset earning
126
134
  * @prop {string} minWithdrawal - Min amount for withdrawal request
135
+ * @prop {number} [unstakingPeriod] - Time to wait withdraw un-stake, in hour
127
136
  * */
128
137
  export interface SpecialYieldPoolStatistic extends BaseYieldPoolStatistic {
129
- /** Info for asset earning */
130
- assetEarning: YieldAssetEarningStats[];
131
138
  /** Min amount for withdrawal request */
132
139
  minWithdrawal: string;
140
+ /** Time to wait withdraw un-stake, in hour */
141
+ unstakingPeriod?: number;
133
142
  }
134
143
  export declare type YieldPoolStatistic = NormalYieldPoolStatistic | SpecialYieldPoolStatistic;
135
144
  /**