@subwallet/extension-base 1.1.28-beta.1 → 1.1.28-beta.3

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 (89) hide show
  1. package/background/KoniTypes.d.ts +15 -13
  2. package/cjs/koni/api/yield/helper/utils.js +2 -2
  3. package/cjs/koni/background/handlers/Extension.js +25 -1
  4. package/cjs/services/earning-service/constants/chains.js +2 -2
  5. package/cjs/services/earning-service/handlers/base.js +25 -7
  6. package/cjs/services/earning-service/handlers/lending/interlay.js +9 -7
  7. package/cjs/services/earning-service/handlers/liquid-staking/acala.js +9 -7
  8. package/cjs/services/earning-service/handlers/liquid-staking/base.js +5 -1
  9. package/cjs/services/earning-service/handlers/liquid-staking/bifrost.js +9 -7
  10. package/cjs/services/earning-service/handlers/liquid-staking/parallel.js +9 -7
  11. package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +9 -7
  12. package/cjs/services/earning-service/handlers/native-staking/amplitude.js +23 -9
  13. package/cjs/services/earning-service/handlers/native-staking/astar.js +28 -8
  14. package/cjs/services/earning-service/handlers/native-staking/base-para.js +5 -5
  15. package/cjs/services/earning-service/handlers/native-staking/base.js +11 -1
  16. package/cjs/services/earning-service/handlers/native-staking/para-chain.js +21 -7
  17. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +35 -18
  18. package/cjs/services/earning-service/handlers/nomination-pool/index.js +35 -15
  19. package/cjs/services/earning-service/handlers/special.js +32 -8
  20. package/cjs/services/earning-service/service.js +41 -17
  21. package/cjs/services/earning-service/utils/index.js +18 -1
  22. package/cjs/services/migration-service/scripts/databases/MigrateEarningHistory.js +21 -0
  23. package/cjs/services/migration-service/scripts/databases/MigrateEarningVersion.js +21 -0
  24. package/cjs/services/migration-service/scripts/index.js +3 -1
  25. package/cjs/services/storage-service/DatabaseService.js +4 -0
  26. package/cjs/services/transaction-service/index.js +12 -7
  27. package/cjs/types/yield/actions/join/step.js +10 -0
  28. package/cjs/types/yield/info/base.js +7 -0
  29. package/cjs/utils/yield/index.js +3 -0
  30. package/koni/api/yield/helper/utils.js +2 -2
  31. package/koni/background/handlers/Extension.d.ts +2 -0
  32. package/koni/background/handlers/Extension.js +25 -1
  33. package/package.json +11 -1
  34. package/services/earning-service/constants/chains.js +2 -2
  35. package/services/earning-service/handlers/base.d.ts +6 -4
  36. package/services/earning-service/handlers/base.js +25 -7
  37. package/services/earning-service/handlers/lending/interlay.d.ts +1 -1
  38. package/services/earning-service/handlers/lending/interlay.js +9 -7
  39. package/services/earning-service/handlers/liquid-staking/acala.d.ts +2 -2
  40. package/services/earning-service/handlers/liquid-staking/acala.js +9 -7
  41. package/services/earning-service/handlers/liquid-staking/base.d.ts +2 -1
  42. package/services/earning-service/handlers/liquid-staking/base.js +5 -1
  43. package/services/earning-service/handlers/liquid-staking/bifrost.d.ts +2 -2
  44. package/services/earning-service/handlers/liquid-staking/bifrost.js +9 -7
  45. package/services/earning-service/handlers/liquid-staking/parallel.d.ts +2 -2
  46. package/services/earning-service/handlers/liquid-staking/parallel.js +9 -7
  47. package/services/earning-service/handlers/liquid-staking/stella-swap.d.ts +1 -1
  48. package/services/earning-service/handlers/liquid-staking/stella-swap.js +9 -7
  49. package/services/earning-service/handlers/native-staking/amplitude.js +23 -9
  50. package/services/earning-service/handlers/native-staking/astar.d.ts +2 -1
  51. package/services/earning-service/handlers/native-staking/astar.js +28 -8
  52. package/services/earning-service/handlers/native-staking/base-para.js +5 -5
  53. package/services/earning-service/handlers/native-staking/base.d.ts +3 -2
  54. package/services/earning-service/handlers/native-staking/base.js +10 -1
  55. package/services/earning-service/handlers/native-staking/para-chain.js +21 -7
  56. package/services/earning-service/handlers/native-staking/relay-chain.js +35 -18
  57. package/services/earning-service/handlers/nomination-pool/index.d.ts +1 -1
  58. package/services/earning-service/handlers/nomination-pool/index.js +34 -15
  59. package/services/earning-service/handlers/special.d.ts +4 -2
  60. package/services/earning-service/handlers/special.js +32 -8
  61. package/services/earning-service/service.d.ts +6 -2
  62. package/services/earning-service/service.js +40 -17
  63. package/services/earning-service/utils/index.d.ts +5 -1
  64. package/services/earning-service/utils/index.js +13 -1
  65. package/services/migration-service/scripts/databases/MigrateEarningHistory.d.ts +4 -0
  66. package/services/migration-service/scripts/databases/MigrateEarningHistory.js +13 -0
  67. package/services/migration-service/scripts/databases/MigrateEarningVersion.d.ts +4 -0
  68. package/services/migration-service/scripts/databases/MigrateEarningVersion.js +13 -0
  69. package/services/migration-service/scripts/index.js +3 -1
  70. package/services/storage-service/DatabaseService.d.ts +1 -0
  71. package/services/storage-service/DatabaseService.js +4 -0
  72. package/services/transaction-service/index.js +12 -7
  73. package/types/yield/actions/join/step.d.ts +19 -0
  74. package/types/yield/actions/join/step.js +12 -0
  75. package/types/yield/actions/others.d.ts +4 -1
  76. package/types/yield/info/account/info.d.ts +3 -14
  77. package/types/yield/info/account/reward.d.ts +3 -14
  78. package/types/yield/info/base.d.ts +17 -0
  79. package/types/yield/info/base.js +8 -0
  80. package/types/yield/info/chain/info.d.ts +81 -63
  81. package/types/yield/info/chain/target.d.ts +4 -0
  82. package/cjs/koni/api/dotsama/balance.js +0 -464
  83. package/cjs/services/migration-service/scripts/MigrateEthProvider.js +0 -17
  84. package/cjs/services/migration-service/scripts/MigratePioneerProvider.js +0 -17
  85. package/cjs/services/migration-service/scripts/MigrateProvider.js +0 -29
  86. package/cjs/services/storage-service/index.js +0 -241
  87. package/cjs/types.js +0 -1
  88. package/cjs/utils/address.js +0 -34
  89. package/cjs/utils/keyring.js +0 -57
@@ -33,10 +33,12 @@ export default class StellaSwapLiquidStakingPoolHandler extends BaseLiquidStakin
33
33
  super(state, chain);
34
34
  this.slug = 'xcDOT___liquid_staking___stellaswap';
35
35
  this.name = 'Stellaswap Liquid Staking';
36
- this.description = 'Earn rewards by staking xcDOT for stDOT';
37
36
  this._logo = 'stellaswap';
38
37
  this.shortName = 'Stellaswap';
39
38
  }
39
+ getDescription() {
40
+ return 'Earn rewards by staking xcDOT for stDOT';
41
+ }
40
42
 
41
43
  /* Subscribe pool info */
42
44
 
@@ -67,13 +69,13 @@ export default class StellaSwapLiquidStakingPoolHandler extends BaseLiquidStakin
67
69
  exchangeRateCall.call()]);
68
70
  const exchangeRate = equivalentTokenShare / 10 ** _getAssetDecimals(derivativeTokenInfo);
69
71
  return {
70
- ...this.defaultInfo,
71
- description: this.description,
72
+ ...this.baseInfo,
72
73
  type: this.type,
73
74
  metadata: {
74
- ...this.baseMetadata,
75
- isAvailable: true,
76
- allowCancelUnstaking: false,
75
+ ...this.metadataInfo,
76
+ description: this.getDescription()
77
+ },
78
+ statistic: {
77
79
  assetEarning: [{
78
80
  slug: this.rewardAssets[0],
79
81
  apr: aprObject.result,
@@ -135,7 +137,7 @@ export default class StellaSwapLiquidStakingPoolHandler extends BaseLiquidStakin
135
137
 
136
138
  const totalBalance = new BN(balance).add(unlockBalance);
137
139
  const result = {
138
- ...this.defaultInfo,
140
+ ...this.baseInfo,
139
141
  type: this.type,
140
142
  address,
141
143
  balanceToken: this.inputAsset,
@@ -17,7 +17,21 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
17
17
  async subscribePoolInfo(callback) {
18
18
  let cancel = false;
19
19
  const nativeToken = this.nativeToken;
20
- const defaultData = this.defaultInfo;
20
+ if (!this.isActive) {
21
+ const data = {
22
+ // TODO
23
+ ...this.baseInfo,
24
+ type: this.type,
25
+ metadata: {
26
+ ...this.metadataInfo,
27
+ description: this.getDescription()
28
+ }
29
+ };
30
+ callback(data);
31
+ return () => {
32
+ cancel = true;
33
+ };
34
+ }
21
35
  const substrateApi = await this.substrateApi.isReady;
22
36
  const unsub = await substrateApi.api.query.parachainStaking.round(async _round => {
23
37
  if (cancel) {
@@ -39,12 +53,13 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
39
53
  const stakeInfo = staked.toPrimitive();
40
54
  const data = {
41
55
  // TODO
42
- ...defaultData,
43
- description: this.description.replaceAll('{{amount}}', minToHuman),
56
+ ...this.baseInfo,
44
57
  type: this.type,
45
58
  metadata: {
46
- inputAsset: nativeToken.slug,
47
- isAvailable: true,
59
+ ...this.metadataInfo,
60
+ description: this.getDescription(minToHuman)
61
+ },
62
+ statistic: {
48
63
  maxCandidatePerFarmer: parseInt(maxDelegations),
49
64
  maxWithdrawalRequestPerFarmer: 1,
50
65
  // by default
@@ -56,8 +71,7 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
56
71
  // TODO recheck
57
72
  totalApy: undefined,
58
73
  // TODO recheck
59
- unstakingPeriod,
60
- allowCancelUnstaking: true
74
+ unstakingPeriod
61
75
  }
62
76
  };
63
77
  callback(data);
@@ -135,7 +149,7 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
135
149
  async subscribePoolPosition(useAddresses, resultCallback) {
136
150
  let cancel = false;
137
151
  const substrateApi = await this.substrateApi.isReady;
138
- const defaultInfo = this.defaultInfo;
152
+ const defaultInfo = this.baseInfo;
139
153
  const chainInfo = this.chainInfo;
140
154
  const unsub = await substrateApi.api.query.parachainStaking.delegatorState.multi(useAddresses, async ledgers => {
141
155
  if (cancel) {
@@ -195,7 +209,7 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
195
209
  return;
196
210
  }
197
211
  callBack({
198
- ...this.defaultInfo,
212
+ ...this.baseInfo,
199
213
  address: address,
200
214
  type: this.type,
201
215
  unclaimedReward: _unclaimedReward.toString(),
@@ -1,10 +1,11 @@
1
1
  import { _ChainInfo } from '@subwallet/chain-list/types';
2
2
  import { ExtrinsicType, UnstakingInfo } from '@subwallet/extension-base/background/KoniTypes';
3
3
  import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
4
- import { BaseYieldPositionInfo, PalletDappsStakingAccountLedger, StakeCancelWithdrawalParams, SubmitJoinNativeStaking, TransactionData, ValidatorInfo, YieldPoolInfo, YieldPositionInfo, YieldStepBaseInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
4
+ import { BaseYieldPoolMetadata, BaseYieldPositionInfo, PalletDappsStakingAccountLedger, StakeCancelWithdrawalParams, SubmitJoinNativeStaking, TransactionData, ValidatorInfo, YieldPoolInfo, YieldPositionInfo, YieldStepBaseInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
5
5
  import BaseParaNativeStakingPoolHandler from './base-para';
6
6
  export declare function getAstarWithdrawable(yieldPosition: YieldPositionInfo): UnstakingInfo | undefined;
7
7
  export default class AstarNativeStakingPoolHandler extends BaseParaNativeStakingPoolHandler {
8
+ protected get metadataInfo(): Omit<BaseYieldPoolMetadata, 'description'>;
8
9
  subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
9
10
  parseNominatorMetadata(chainInfo: _ChainInfo, address: string, substrateApi: _SubstrateApi, ledger: PalletDappsStakingAccountLedger): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
10
11
  subscribePoolPosition(useAddresses: string[], resultCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
@@ -35,12 +35,32 @@ export function getAstarWithdrawable(yieldPosition) {
35
35
  }
36
36
  }
37
37
  export default class AstarNativeStakingPoolHandler extends BaseParaNativeStakingPoolHandler {
38
+ get metadataInfo() {
39
+ const result = super.metadataInfo;
40
+ result.allowCancelUnstaking = false;
41
+ return result;
42
+ }
43
+
38
44
  /* Subscribe pool info */
39
45
 
40
46
  async subscribePoolInfo(callback) {
41
47
  let cancel = false;
42
48
  const nativeToken = this.nativeToken;
43
- const defaultData = this.defaultInfo;
49
+ if (!this.isActive) {
50
+ const data = {
51
+ // TODO
52
+ ...this.baseInfo,
53
+ type: this.type,
54
+ metadata: {
55
+ ...this.metadataInfo,
56
+ description: this.getDescription()
57
+ }
58
+ };
59
+ callback(data);
60
+ return () => {
61
+ cancel = true;
62
+ };
63
+ }
44
64
  const apyPromise = new Promise(resolve => {
45
65
  fetch(`https://api.astar.network/api/v1/${this.chain}/dapps-staking/apy`, {
46
66
  method: 'GET'
@@ -75,12 +95,13 @@ export default class AstarNativeStakingPoolHandler extends BaseParaNativeStaking
75
95
  const minToHuman = formatNumber(minDelegatorStake, nativeToken.decimals || 0, balanceFormatter);
76
96
  const data = {
77
97
  // TODO
78
- ...defaultData,
79
- description: this.description.replaceAll('{{amount}}', minToHuman),
98
+ ...this.baseInfo,
80
99
  type: this.type,
81
100
  metadata: {
82
- inputAsset: nativeToken.slug,
83
- isAvailable: true,
101
+ ...this.metadataInfo,
102
+ description: this.getDescription(minToHuman)
103
+ },
104
+ statistic: {
84
105
  maxCandidatePerFarmer: 100,
85
106
  // temporary fix for Astar, there's no limit for now
86
107
  maxWithdrawalRequestPerFarmer: 1,
@@ -93,8 +114,7 @@ export default class AstarNativeStakingPoolHandler extends BaseParaNativeStaking
93
114
  // TODO recheck
94
115
  totalApy: apyInfo !== null ? apyInfo : undefined,
95
116
  // TODO recheck
96
- unstakingPeriod,
97
- allowCancelUnstaking: false
117
+ unstakingPeriod
98
118
  }
99
119
  };
100
120
  callback(data);
@@ -201,7 +221,7 @@ export default class AstarNativeStakingPoolHandler extends BaseParaNativeStaking
201
221
  async subscribePoolPosition(useAddresses, resultCallback) {
202
222
  let cancel = false;
203
223
  const substrateApi = await this.substrateApi.isReady;
204
- const defaultInfo = this.defaultInfo;
224
+ const defaultInfo = this.baseInfo;
205
225
  const chainInfo = this.chainInfo;
206
226
  const unsub = await substrateApi.api.query.dappsStaking.ledger.multi(useAddresses, async ledgers => {
207
227
  if (cancel) {
@@ -29,17 +29,17 @@ export default class BaseParaNativeStakingPoolHandler extends BaseNativeStakingP
29
29
  const poolInfo = await this.getPoolInfo();
30
30
  const poolPosition = await this.getPoolPosition(address);
31
31
  const chainInfo = this.chainInfo;
32
- if (!poolInfo) {
32
+ if (!poolInfo || !poolInfo.statistic) {
33
33
  return Promise.resolve([new TransactionError(BasicTxErrorType.INTERNAL_ERROR)]);
34
34
  }
35
35
  const errors = [];
36
36
  const selectedCollator = selectedValidators[0];
37
37
  let bnTotalStake = new BN(amount);
38
- const bnChainMinStake = new BN(poolInfo.metadata.minJoinPool || '0');
38
+ const bnChainMinStake = new BN(poolInfo.statistic.minJoinPool || '0');
39
39
  const bnCollatorMinStake = new BN(selectedCollator.minBond || '0');
40
40
  const bnMinStake = bnCollatorMinStake > bnChainMinStake ? bnCollatorMinStake : bnChainMinStake;
41
41
  const minStakeErrorMessage = getMinStakeErrorMessage(chainInfo, bnMinStake);
42
- const maxValidator = poolInfo.metadata.maxCandidatePerFarmer;
42
+ const maxValidator = poolInfo.statistic.maxCandidatePerFarmer;
43
43
  const maxValidatorErrorMessage = getMaxValidatorErrorMessage(chainInfo, maxValidator);
44
44
  const existUnstakeErrorMessage = getExistUnstakeErrorMessage(chainInfo.slug, StakingType.NOMINATED, true);
45
45
  if (!poolPosition || poolPosition.status === EarningStatus.NOT_STAKING) {
@@ -93,7 +93,7 @@ export default class BaseParaNativeStakingPoolHandler extends BaseNativeStakingP
93
93
  const errors = [];
94
94
  const poolInfo = await this.getPoolInfo();
95
95
  const poolPosition = await this.getPoolPosition(address);
96
- if (!poolInfo || !poolPosition || fastLeave || !selectedTarget) {
96
+ if (!poolInfo || !poolInfo.statistic || !poolPosition || fastLeave || !selectedTarget) {
97
97
  return [new TransactionError(BasicTxErrorType.INTERNAL_ERROR)];
98
98
  }
99
99
  if (fastLeave) {
@@ -112,7 +112,7 @@ export default class BaseParaNativeStakingPoolHandler extends BaseNativeStakingP
112
112
  }
113
113
  const bnActiveStake = new BN(targetNomination.activeStake);
114
114
  const bnRemainingStake = bnActiveStake.sub(new BN(amount));
115
- const bnChainMinStake = new BN(poolInfo.metadata.minJoinPool || '0');
115
+ const bnChainMinStake = new BN(poolInfo.statistic.minJoinPool || '0');
116
116
  const bnCollatorMinStake = new BN(targetNomination.validatorMinStake || '0');
117
117
  const bnMinStake = BN.max(bnCollatorMinStake, bnChainMinStake);
118
118
  const existUnstakeErrorMessage = getExistUnstakeErrorMessage(this.chain, StakingType.NOMINATED);
@@ -1,14 +1,15 @@
1
1
  import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
2
2
  import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
3
- import { EarningRewardItem, HandleYieldStepData, OptimalYieldPath, OptimalYieldPathParams, SubmitJoinNativeStaking, SubmitYieldJoinData, TransactionData, YieldPoolType, YieldPositionInfo, YieldStepBaseInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
3
+ import { BaseYieldPoolMetadata, EarningRewardItem, HandleYieldStepData, OptimalYieldPath, OptimalYieldPathParams, SubmitJoinNativeStaking, SubmitYieldJoinData, TransactionData, YieldPoolType, YieldPositionInfo, YieldStepBaseInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
4
4
  import BasePoolHandler from '../base';
5
5
  export default abstract class BaseNativeStakingPoolHandler extends BasePoolHandler {
6
6
  readonly type = YieldPoolType.NATIVE_STAKING;
7
- protected readonly description: string;
8
7
  protected readonly name: string;
9
8
  protected readonly shortName: string;
10
9
  slug: string;
11
10
  constructor(state: KoniState, chain: string);
11
+ protected getDescription(amount?: string): string;
12
+ protected get metadataInfo(): Omit<BaseYieldPoolMetadata, 'description'>;
12
13
  getPoolReward(useAddresses: string[], callBack: (rs: EarningRewardItem) => void): Promise<VoidFunction>;
13
14
  get defaultSubmitStep(): YieldStepBaseInfo;
14
15
  abstract createJoinExtrinsic(data: SubmitJoinNativeStaking, positionInfo?: YieldPositionInfo, bondDest?: string): Promise<[TransactionData, YieldTokenBaseInfo]>;
@@ -16,7 +16,16 @@ export default class BaseNativeStakingPoolHandler extends BasePoolHandler {
16
16
  this.slug = `${symbol}___native_staking___${_chainInfo.slug}`;
17
17
  this.name = `${_chainInfo.name} Native Staking`;
18
18
  this.shortName = _chainInfo.name.replaceAll(' Relay Chain', '');
19
- this.description = `Start staking with just {{amount}} ${symbol}`;
19
+ }
20
+ getDescription(amount = '0') {
21
+ const _chainAsset = this.nativeToken;
22
+ const symbol = _chainAsset.symbol;
23
+ return `Start staking with just {{amount}} ${symbol}`.replace('{{amount}}', amount);
24
+ }
25
+ get metadataInfo() {
26
+ const result = super.metadataInfo;
27
+ result.allowCancelUnstaking = true;
28
+ return result;
20
29
  }
21
30
 
22
31
  /* Get pool reward */
@@ -17,7 +17,21 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
17
17
  let cancel = false;
18
18
  const chainApi = this.substrateApi;
19
19
  const nativeToken = this.nativeToken;
20
- const defaultData = this.defaultInfo;
20
+ if (!this.isActive) {
21
+ const data = {
22
+ // TODO
23
+ ...this.baseInfo,
24
+ type: this.type,
25
+ metadata: {
26
+ ...this.metadataInfo,
27
+ description: this.getDescription()
28
+ }
29
+ };
30
+ callback(data);
31
+ return () => {
32
+ cancel = true;
33
+ };
34
+ }
21
35
  await chainApi.isReady;
22
36
  const unsub = await chainApi.api.query.parachainStaking.round(async _round => {
23
37
  var _chainApi$api$consts, _chainApi$api$consts$, _chainApi$api$consts$2;
@@ -52,12 +66,13 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
52
66
  const minToHuman = formatNumber(minStake.toString(), nativeToken.decimals || 0, balanceFormatter);
53
67
  const data = {
54
68
  // TODO
55
- ...defaultData,
56
- description: this.description.replaceAll('{{amount}}', minToHuman),
69
+ ...this.baseInfo,
57
70
  type: this.type,
58
71
  metadata: {
59
- inputAsset: nativeToken.slug,
60
- isAvailable: true,
72
+ ...this.metadataInfo,
73
+ description: this.getDescription(minToHuman)
74
+ },
75
+ statistic: {
61
76
  maxCandidatePerFarmer: parseInt(maxDelegations),
62
77
  maxWithdrawalRequestPerFarmer: 1,
63
78
  // by default
@@ -69,7 +84,6 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
69
84
  // not have
70
85
  tvl: totalStake.toString(),
71
86
  unstakingPeriod: unstakingPeriod,
72
- allowCancelUnstaking: true,
73
87
  inflation
74
88
  }
75
89
  };
@@ -169,7 +183,7 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
169
183
  async subscribePoolPosition(useAddresses, resultCallback) {
170
184
  let cancel = false;
171
185
  const substrateApi = this.substrateApi;
172
- const defaultInfo = this.defaultInfo;
186
+ const defaultInfo = this.baseInfo;
173
187
  const chainInfo = this.chainInfo;
174
188
  await substrateApi.isReady;
175
189
  const unsub = await substrateApi.api.query.parachainStaking.delegatorState.multi(useAddresses, async ledgers => {
@@ -22,7 +22,21 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
22
22
  const substrateApi = this.substrateApi;
23
23
  const chainInfo = this.chainInfo;
24
24
  const nativeToken = this.nativeToken;
25
- const defaultData = this.defaultInfo;
25
+ if (!this.isActive) {
26
+ const data = {
27
+ // TODO
28
+ ...this.baseInfo,
29
+ type: this.type,
30
+ metadata: {
31
+ ...this.metadataInfo,
32
+ description: this.getDescription()
33
+ }
34
+ };
35
+ callback(data);
36
+ return () => {
37
+ cancel = true;
38
+ };
39
+ }
26
40
  await substrateApi.isReady;
27
41
  const unsub = await ((_substrateApi$api$que = substrateApi.api.query.staking) === null || _substrateApi$api$que === void 0 ? void 0 : _substrateApi$api$que.currentEra(async _currentEra => {
28
42
  var _substrateApi$api$con, _substrateApi$api$con2, _substrateApi$api$que2, _substrateApi$api$que3, _substrateApi$api$que4, _substrateApi$api$que5, _substrateApi$api$que6;
@@ -52,12 +66,13 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
52
66
  const minToHuman = formatNumber(minStake.toString(), nativeToken.decimals || 0, balanceFormatter);
53
67
  const data = {
54
68
  // TODO
55
- ...defaultData,
56
- description: this.description.replaceAll('{{amount}}', minToHuman),
69
+ ...this.baseInfo,
57
70
  type: this.type,
58
71
  metadata: {
59
- inputAsset: nativeToken.slug,
60
- isAvailable: true,
72
+ ...this.metadataInfo,
73
+ description: this.getDescription(minToHuman)
74
+ },
75
+ statistic: {
61
76
  maxCandidatePerFarmer: parseInt(maxNominations),
62
77
  maxWithdrawalRequestPerFarmer: parseInt(maxUnlockingChunks),
63
78
  // TODO recheck
@@ -69,7 +84,6 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
69
84
  totalApy: expectedReturn,
70
85
  // TODO recheck
71
86
  unstakingPeriod: unlockingPeriod,
72
- allowCancelUnstaking: true,
73
87
  inflation: inflation
74
88
  }
75
89
  };
@@ -134,7 +148,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
134
148
  let stakingStatus = EarningStatus.NOT_EARNING;
135
149
  const bnActiveStake = new BN(activeStake);
136
150
  let waitingNominationCount = 0;
137
- if (bnActiveStake.gte(minStake)) {
151
+ if (bnActiveStake.gte(minStake) && bnActiveStake.gt(BN_ZERO)) {
138
152
  for (const nomination of nominationList) {
139
153
  if (nomination.status === EarningStatus.EARNING_REWARD) {
140
154
  // only need 1 earning nomination to count
@@ -173,7 +187,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
173
187
  var _substrateApi$api$que19;
174
188
  let cancel = false;
175
189
  const substrateApi = await this.substrateApi.isReady;
176
- const defaultInfo = this.defaultInfo;
190
+ const defaultInfo = this.baseInfo;
177
191
  const chainInfo = this.chainInfo;
178
192
  const unsub = await ((_substrateApi$api$que19 = substrateApi.api.query.staking) === null || _substrateApi$api$que19 === void 0 ? void 0 : _substrateApi$api$que19.ledger.multi(useAddresses, async ledgers => {
179
193
  if (cancel) {
@@ -225,7 +239,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
225
239
  const decimals = this.nativeToken.decimals || 0;
226
240
  const chainApi = await this.substrateApi.isReady;
227
241
  const poolInfo = await this.getPoolInfo();
228
- if (!poolInfo) {
242
+ if (!poolInfo || !poolInfo.statistic) {
229
243
  return Promise.reject(new TransactionError(BasicTxErrorType.INTERNAL_ERROR));
230
244
  }
231
245
  const _era = await chainApi.api.query.staking.currentEra();
@@ -292,13 +306,13 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
292
306
  const commission = extraInfoMap[validator.address].commission;
293
307
  const bnValidatorStake = totalStakeMap[validator.address].div(bnDecimals);
294
308
  if (_STAKING_CHAIN_GROUP.aleph.includes(this.chain)) {
295
- validator.expectedReturn = calculateAlephZeroValidatorReturn(poolInfo.metadata.totalApy, getCommission(commission));
309
+ validator.expectedReturn = calculateAlephZeroValidatorReturn(poolInfo.statistic.totalApy, getCommission(commission));
296
310
  } else if (_STAKING_CHAIN_GROUP.ternoa.includes(this.chain)) {
297
311
  const rewardPerValidator = new BN(stakingRewards.sessionExtraRewardPayout).divn(allValidators.length).div(bnDecimals);
298
312
  const validatorStake = totalStakeMap[validator.address].div(bnDecimals).toNumber();
299
313
  validator.expectedReturn = calculateTernoaValidatorReturn(rewardPerValidator.toNumber(), validatorStake, getCommission(commission));
300
314
  } else {
301
- validator.expectedReturn = calculateValidatorStakedReturn(poolInfo.metadata.totalApy, bnValidatorStake, bnAvgStake, getCommission(commission));
315
+ validator.expectedReturn = calculateValidatorStakedReturn(poolInfo.statistic.totalApy, bnValidatorStake, bnAvgStake, getCommission(commission));
302
316
  }
303
317
  validator.commission = parseFloat(commission.split('%')[0]);
304
318
  validator.blocked = extraInfoMap[validator.address].blocked;
@@ -325,16 +339,19 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
325
339
  return Promise.resolve([new TransactionError(BasicTxErrorType.INTERNAL_ERROR)]);
326
340
  }
327
341
  const poolInfo = _poolInfo;
342
+ if (!poolInfo.statistic) {
343
+ return Promise.resolve([new TransactionError(BasicTxErrorType.INTERNAL_ERROR)]);
344
+ }
328
345
  const errors = [];
329
346
  let bnTotalStake = new BN(amount);
330
- const bnMinStake = new BN(poolInfo.metadata.minJoinPool);
347
+ const bnMinStake = new BN(poolInfo.statistic.minJoinPool);
331
348
  const minStakeErrorMessage = getMinStakeErrorMessage(chainInfo, bnMinStake);
332
- const maxValidatorErrorMessage = getMaxValidatorErrorMessage(chainInfo, poolInfo.metadata.maxCandidatePerFarmer);
349
+ const maxValidatorErrorMessage = getMaxValidatorErrorMessage(chainInfo, poolInfo.statistic.maxCandidatePerFarmer);
333
350
  if (!poolPosition || poolPosition.status === EarningStatus.NOT_STAKING) {
334
351
  if (!bnTotalStake.gte(bnMinStake)) {
335
352
  errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE, minStakeErrorMessage));
336
353
  }
337
- if (selectedValidators.length > poolInfo.metadata.maxCandidatePerFarmer) {
354
+ if (selectedValidators.length > poolInfo.statistic.maxCandidatePerFarmer) {
338
355
  errors.push(new TransactionError(StakingTxErrorType.EXCEED_MAX_NOMINATIONS, maxValidatorErrorMessage));
339
356
  }
340
357
  return errors;
@@ -344,7 +361,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
344
361
  if (!bnTotalStake.gte(bnMinStake)) {
345
362
  errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE, minStakeErrorMessage));
346
363
  }
347
- if (selectedValidators.length > poolInfo.metadata.maxCandidatePerFarmer) {
364
+ if (selectedValidators.length > poolInfo.statistic.maxCandidatePerFarmer) {
348
365
  errors.push(new TransactionError(StakingTxErrorType.EXCEED_MAX_NOMINATIONS, maxValidatorErrorMessage));
349
366
  }
350
367
  return errors;
@@ -436,7 +453,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
436
453
  const errors = [];
437
454
  const poolInfo = await this.getPoolInfo();
438
455
  const poolPosition = await this.getPoolPosition(address);
439
- if (!poolInfo || !poolPosition || fastLeave) {
456
+ if (!poolInfo || !poolInfo.statistic || !poolPosition || fastLeave) {
440
457
  return [new TransactionError(BasicTxErrorType.INTERNAL_ERROR)];
441
458
  }
442
459
  if (fastLeave) {
@@ -444,8 +461,8 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
444
461
  }
445
462
  const bnActiveStake = new BN(poolPosition.activeStake);
446
463
  const bnRemainingStake = bnActiveStake.sub(new BN(amount));
447
- const minStake = new BN(poolInfo.metadata.minJoinPool || '0');
448
- const maxUnstake = poolInfo.metadata.maxWithdrawalRequestPerFarmer;
464
+ const minStake = new BN(poolInfo.statistic.minJoinPool || '0');
465
+ const maxUnstake = poolInfo.statistic.maxWithdrawalRequestPerFarmer;
449
466
  if (!(bnRemainingStake.isZero() || bnRemainingStake.gte(minStake))) {
450
467
  errors.push(new TransactionError(StakingTxErrorType.INVALID_ACTIVE_STAKE));
451
468
  }
@@ -6,11 +6,11 @@ import { BaseYieldPositionInfo, EarningRewardItem, HandleYieldStepData, Nominati
6
6
  import BasePoolHandler from '../base';
7
7
  export default class NominationPoolHandler extends BasePoolHandler {
8
8
  readonly type = YieldPoolType.NOMINATION_POOL;
9
- protected readonly description: string;
10
9
  protected readonly name: string;
11
10
  protected readonly shortName: string;
12
11
  slug: string;
13
12
  constructor(state: KoniState, chain: string);
13
+ protected getDescription(amount?: string): string;
14
14
  subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
15
15
  parsePoolMemberMetadata(substrateApi: _SubstrateApi, poolMemberInfo: PalletNominationPoolsPoolMember): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
16
16
  subscribePoolPosition(useAddresses: string[], resultCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
@@ -23,7 +23,11 @@ export default class NominationPoolHandler extends BasePoolHandler {
23
23
  this.slug = `${symbol}___nomination_pool___${_chainInfo.slug}`;
24
24
  this.name = `${tokenName} Nomination Pool`;
25
25
  this.shortName = _chainInfo.name.replaceAll(' Relay Chain', '');
26
- this.description = `Start staking with just {{amount}} ${symbol}`;
26
+ }
27
+ getDescription(amount = '0') {
28
+ const _chainAsset = this.nativeToken;
29
+ const symbol = _chainAsset.symbol;
30
+ return `Start staking with just {{amount}} ${symbol}`.replace('{{amount}}', amount);
27
31
  }
28
32
 
29
33
  /* Subscribe pool info */
@@ -34,7 +38,21 @@ export default class NominationPoolHandler extends BasePoolHandler {
34
38
  const substrateApi = this.substrateApi;
35
39
  const chainInfo = this.chainInfo;
36
40
  const nativeToken = this.nativeToken;
37
- const defaultData = this.defaultInfo;
41
+ if (!this.isActive) {
42
+ const data = {
43
+ // TODO
44
+ ...this.baseInfo,
45
+ type: this.type,
46
+ metadata: {
47
+ ...this.metadataInfo,
48
+ description: this.getDescription()
49
+ }
50
+ };
51
+ callback(data);
52
+ return () => {
53
+ cancel = true;
54
+ };
55
+ }
38
56
  await substrateApi.isReady;
39
57
  const unsub = await ((_substrateApi$api$que = substrateApi.api.query.staking) === null || _substrateApi$api$que === void 0 ? void 0 : _substrateApi$api$que.currentEra(async _currentEra => {
40
58
  var _substrateApi$api$que2, _substrateApi$api$que3, _substrateApi$api$que4;
@@ -62,12 +80,13 @@ export default class NominationPoolHandler extends BasePoolHandler {
62
80
  const minToHuman = formatNumber(minPoolJoin || '0', nativeToken.decimals || 0, balanceFormatter);
63
81
  const data = {
64
82
  // TODO
65
- ...defaultData,
66
- description: this.description.replaceAll('{{amount}}', minToHuman),
83
+ ...this.baseInfo,
67
84
  type: this.type,
68
85
  metadata: {
69
- inputAsset: nativeToken.slug,
70
- isAvailable: true,
86
+ ...this.metadataInfo,
87
+ description: this.getDescription(minToHuman)
88
+ },
89
+ statistic: {
71
90
  maxCandidatePerFarmer: 1,
72
91
  maxWithdrawalRequestPerFarmer: parseInt(maxUnlockingChunks),
73
92
  // TODO recheck
@@ -80,7 +99,6 @@ export default class NominationPoolHandler extends BasePoolHandler {
80
99
  totalApy: expectedReturn,
81
100
  // TODO recheck
82
101
  unstakingPeriod: unlockingPeriod,
83
- allowCancelUnstaking: false,
84
102
  inflation: inflation
85
103
  }
86
104
  };
@@ -170,7 +188,7 @@ export default class NominationPoolHandler extends BasePoolHandler {
170
188
  var _substrateApi$api$que5, _substrateApi$api$que6;
171
189
  let cancel = false;
172
190
  const substrateApi = this.substrateApi;
173
- const defaultInfo = this.defaultInfo;
191
+ const defaultInfo = this.baseInfo;
174
192
  await substrateApi.isReady;
175
193
  const unsub = await ((_substrateApi$api$que5 = substrateApi.api.query) === null || _substrateApi$api$que5 === void 0 ? void 0 : (_substrateApi$api$que6 = _substrateApi$api$que5.nominationPools) === null || _substrateApi$api$que6 === void 0 ? void 0 : _substrateApi$api$que6.poolMembers.multi(useAddresses, async ledgers => {
176
194
  if (cancel) {
@@ -229,7 +247,7 @@ export default class NominationPoolHandler extends BasePoolHandler {
229
247
  const _unclaimedReward = await ((_substrateApi$api$cal = substrateApi.api.call) === null || _substrateApi$api$cal === void 0 ? void 0 : (_substrateApi$api$cal2 = _substrateApi$api$cal.nominationPoolsApi) === null || _substrateApi$api$cal2 === void 0 ? void 0 : _substrateApi$api$cal2.pendingRewards(address));
230
248
  if (_unclaimedReward) {
231
249
  callBack({
232
- ...this.defaultInfo,
250
+ ...this.baseInfo,
233
251
  address: address,
234
252
  type: this.type,
235
253
  unclaimedReward: _unclaimedReward.toString(),
@@ -322,13 +340,14 @@ export default class NominationPoolHandler extends BasePoolHandler {
322
340
  }, fee];
323
341
  }
324
342
  async validateYieldJoin(data, path) {
343
+ var _poolInfo$statistic;
325
344
  const {
326
345
  address,
327
346
  amount,
328
347
  selectedPool
329
348
  } = data;
330
349
  const _poolInfo = await this.getPoolInfo();
331
- if (!_poolInfo) {
350
+ if (!_poolInfo || !_poolInfo.statistic) {
332
351
  return Promise.resolve([new TransactionError(BasicTxErrorType.INTERNAL_ERROR)]);
333
352
  }
334
353
  const poolInfo = _poolInfo;
@@ -339,7 +358,7 @@ export default class NominationPoolHandler extends BasePoolHandler {
339
358
  // amount >= min stake
340
359
  const errors = [];
341
360
  let bnTotalStake = new BN(amount);
342
- const bnMinStake = new BN(poolInfo.metadata.minJoinPool || '0');
361
+ const bnMinStake = new BN(((_poolInfo$statistic = poolInfo.statistic) === null || _poolInfo$statistic === void 0 ? void 0 : _poolInfo$statistic.minJoinPool) || '0');
343
362
  const minStakeErrorMessage = getMinStakeErrorMessage(chainInfo, bnMinStake);
344
363
  const existUnstakeErrorMessage = getExistUnstakeErrorMessage(chainInfo.slug, StakingType.POOLED, true);
345
364
  if (selectedPool.state !== 'Open') {
@@ -394,7 +413,7 @@ export default class NominationPoolHandler extends BasePoolHandler {
394
413
  selectedPool
395
414
  } = data;
396
415
  const positionInfo = await this.getPoolPosition(address);
397
- const [extrinsic] = await this.createJoinExtrinsic(data);
416
+ const [extrinsic] = await this.createJoinExtrinsic(data, positionInfo);
398
417
  const joinPoolData = {
399
418
  poolPosition: positionInfo,
400
419
  slug: this.slug,
@@ -422,7 +441,7 @@ export default class NominationPoolHandler extends BasePoolHandler {
422
441
  const errors = [];
423
442
  const poolInfo = await this.getPoolInfo();
424
443
  const poolPosition = await this.getPoolPosition(address);
425
- if (!poolInfo || !poolPosition || fastLeave) {
444
+ if (!poolInfo || !poolPosition || fastLeave || !poolInfo.statistic) {
426
445
  return [new TransactionError(BasicTxErrorType.INTERNAL_ERROR)];
427
446
  }
428
447
  if (fastLeave) {
@@ -430,8 +449,8 @@ export default class NominationPoolHandler extends BasePoolHandler {
430
449
  }
431
450
  const bnActiveStake = new BN(poolPosition.activeStake);
432
451
  const bnRemainingStake = bnActiveStake.sub(new BN(amount));
433
- const minStake = new BN(poolInfo.metadata.minJoinPool || '0');
434
- const maxUnstake = poolInfo.metadata.maxWithdrawalRequestPerFarmer;
452
+ const minStake = new BN(poolInfo.statistic.minJoinPool || '0');
453
+ const maxUnstake = poolInfo.statistic.maxWithdrawalRequestPerFarmer;
435
454
  if (!(bnRemainingStake.isZero() || bnRemainingStake.gte(minStake))) {
436
455
  errors.push(new TransactionError(StakingTxErrorType.INVALID_ACTIVE_STAKE));
437
456
  }
@@ -1,6 +1,6 @@
1
1
  import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
2
2
  import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
3
- import { BaseYieldStepDetail, HandleYieldStepData, OptimalYieldPath, OptimalYieldPathParams, SpecialYieldPoolInfo, SpecialYieldPoolMetadata, SubmitYieldJoinData, TransactionData, UnstakingInfo, YieldPoolInfo, YieldPoolTarget, YieldStepBaseInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
3
+ import { BaseYieldStepDetail, HandleYieldStepData, OptimalYieldPath, OptimalYieldPathParams, SpecialYieldPoolInfo, SpecialYieldPoolMetadata, SubmitYieldJoinData, TransactionData, UnstakingInfo, YieldPoolInfo, YieldPoolTarget, YieldPoolType, YieldStepBaseInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
4
4
  import BN from 'bn.js';
5
5
  import BasePoolHandler from './base';
6
6
  export default abstract class BaseSpecialStakingPoolHandler extends BasePoolHandler {
@@ -9,11 +9,13 @@ export default abstract class BaseSpecialStakingPoolHandler extends BasePoolHand
9
9
  protected abstract inputAsset: string;
10
10
  protected abstract rewardAssets: string[];
11
11
  protected abstract feeAssets: string[];
12
+ /** Pool's type */
13
+ abstract type: YieldPoolType.LIQUID_STAKING | YieldPoolType.LENDING;
12
14
  /** Allow to create default unstake transaction */
13
15
  protected readonly allowDefaultUnstake: boolean;
14
16
  /** Allow to create fast unstake transaction */
15
17
  protected readonly allowFastUnstake: boolean;
16
- protected get baseMetadata(): Pick<SpecialYieldPoolMetadata, 'altInputAssets' | 'derivativeAssets' | 'inputAsset' | 'rewardAssets' | 'feeAssets'>;
18
+ protected get metadataInfo(): Omit<SpecialYieldPoolMetadata, 'description'>;
17
19
  get isPoolSupportAlternativeFee(): boolean;
18
20
  get group(): string;
19
21
  abstract getPoolStat(): Promise<SpecialYieldPoolInfo>;