@subwallet/extension-base 1.3.46-0 → 1.3.48-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 (119) hide show
  1. package/background/KoniTypes.d.ts +7 -1
  2. package/background/KoniTypes.js +1 -0
  3. package/background/errors/TransactionError.js +4 -0
  4. package/cjs/background/KoniTypes.js +1 -0
  5. package/cjs/background/errors/TransactionError.js +4 -0
  6. package/cjs/core/logic-validation/transfer.js +7 -0
  7. package/cjs/koni/api/nft/config.js +1 -1
  8. package/cjs/koni/api/nft/ordinal_nft/index.js +3 -2
  9. package/cjs/koni/background/handlers/Extension.js +21 -1
  10. package/cjs/koni/background/handlers/State.js +3 -0
  11. package/cjs/packageInfo.js +1 -1
  12. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +8 -14
  13. package/cjs/services/buy-service/index.js +2 -0
  14. package/cjs/services/chain-service/index.js +7 -2
  15. package/cjs/services/chain-service/utils/index.js +3 -0
  16. package/cjs/services/chain-service/utils/patch.js +1 -1
  17. package/cjs/services/earning-service/constants/chains.js +4 -2
  18. package/cjs/services/earning-service/handlers/lending/interlay.js +2 -1
  19. package/cjs/services/earning-service/handlers/liquid-staking/acala.js +2 -1
  20. package/cjs/services/earning-service/handlers/liquid-staking/bifrost.js +2 -1
  21. package/cjs/services/earning-service/handlers/liquid-staking/parallel.js +2 -1
  22. package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +2 -1
  23. package/cjs/services/earning-service/handlers/native-staking/amplitude.js +32 -0
  24. package/cjs/services/earning-service/handlers/native-staking/astar.js +20 -1
  25. package/cjs/services/earning-service/handlers/native-staking/base.js +42 -30
  26. package/cjs/services/earning-service/handlers/native-staking/dtao.js +79 -21
  27. package/cjs/services/earning-service/handlers/native-staking/mythos.js +30 -1
  28. package/cjs/services/earning-service/handlers/native-staking/para-chain.js +17 -0
  29. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +49 -6
  30. package/cjs/services/earning-service/handlers/native-staking/tao.js +98 -32
  31. package/cjs/services/earning-service/handlers/nomination-pool/index.js +5 -2
  32. package/cjs/services/earning-service/handlers/special.js +3 -1
  33. package/cjs/services/earning-service/service.js +52 -7
  34. package/cjs/services/history-service/index.js +12 -7
  35. package/cjs/services/subscan-service/index.js +35 -104
  36. package/cjs/services/transaction-service/helpers/index.js +2 -0
  37. package/cjs/services/transaction-service/index.js +15 -0
  38. package/cjs/services/transaction-service/utils.js +10 -1
  39. package/cjs/strategy/api-request-strategy/index.js +1 -0
  40. package/cjs/strategy/api-request-strategy/utils/index.js +2 -2
  41. package/cjs/strategy/api-request-strategy-v2/index.js +138 -0
  42. package/cjs/strategy/api-request-strategy-v2/types.js +1 -0
  43. package/cjs/types/transaction/error.js +1 -0
  44. package/cjs/utils/account/transform.js +3 -2
  45. package/cjs/utils/gear/combine.js +4 -3
  46. package/cjs/utils/gear/vft.js +104 -135
  47. package/core/logic-validation/transfer.js +7 -0
  48. package/koni/api/nft/config.d.ts +1 -1
  49. package/koni/api/nft/config.js +1 -1
  50. package/koni/api/nft/ordinal_nft/index.js +3 -2
  51. package/koni/background/handlers/Extension.d.ts +1 -0
  52. package/koni/background/handlers/Extension.js +21 -1
  53. package/koni/background/handlers/State.js +4 -1
  54. package/package.json +20 -9
  55. package/packageInfo.js +1 -1
  56. package/services/balance-service/helpers/subscribe/substrate/index.js +8 -14
  57. package/services/buy-service/index.js +2 -0
  58. package/services/chain-service/index.js +7 -2
  59. package/services/chain-service/utils/index.js +3 -0
  60. package/services/chain-service/utils/patch.js +1 -1
  61. package/services/earning-service/constants/chains.d.ts +1 -0
  62. package/services/earning-service/constants/chains.js +2 -1
  63. package/services/earning-service/handlers/base.d.ts +5 -3
  64. package/services/earning-service/handlers/lending/interlay.d.ts +1 -1
  65. package/services/earning-service/handlers/lending/interlay.js +2 -1
  66. package/services/earning-service/handlers/liquid-staking/acala.d.ts +1 -1
  67. package/services/earning-service/handlers/liquid-staking/acala.js +2 -1
  68. package/services/earning-service/handlers/liquid-staking/bifrost.d.ts +1 -1
  69. package/services/earning-service/handlers/liquid-staking/bifrost.js +2 -1
  70. package/services/earning-service/handlers/liquid-staking/parallel.d.ts +1 -1
  71. package/services/earning-service/handlers/liquid-staking/parallel.js +2 -1
  72. package/services/earning-service/handlers/liquid-staking/stella-swap.d.ts +1 -1
  73. package/services/earning-service/handlers/liquid-staking/stella-swap.js +2 -1
  74. package/services/earning-service/handlers/native-staking/amplitude.d.ts +1 -0
  75. package/services/earning-service/handlers/native-staking/amplitude.js +32 -0
  76. package/services/earning-service/handlers/native-staking/astar.d.ts +2 -1
  77. package/services/earning-service/handlers/native-staking/astar.js +20 -1
  78. package/services/earning-service/handlers/native-staking/base.d.ts +4 -2
  79. package/services/earning-service/handlers/native-staking/base.js +42 -30
  80. package/services/earning-service/handlers/native-staking/dtao.d.ts +5 -3
  81. package/services/earning-service/handlers/native-staking/dtao.js +80 -22
  82. package/services/earning-service/handlers/native-staking/mythos.d.ts +2 -1
  83. package/services/earning-service/handlers/native-staking/mythos.js +30 -1
  84. package/services/earning-service/handlers/native-staking/para-chain.d.ts +1 -0
  85. package/services/earning-service/handlers/native-staking/para-chain.js +17 -0
  86. package/services/earning-service/handlers/native-staking/relay-chain.d.ts +6 -1
  87. package/services/earning-service/handlers/native-staking/relay-chain.js +50 -7
  88. package/services/earning-service/handlers/native-staking/tao.d.ts +23 -4
  89. package/services/earning-service/handlers/native-staking/tao.js +99 -33
  90. package/services/earning-service/handlers/nomination-pool/index.d.ts +3 -2
  91. package/services/earning-service/handlers/nomination-pool/index.js +5 -2
  92. package/services/earning-service/handlers/special.d.ts +2 -1
  93. package/services/earning-service/handlers/special.js +3 -1
  94. package/services/earning-service/service.d.ts +3 -1
  95. package/services/earning-service/service.js +52 -7
  96. package/services/history-service/index.js +12 -7
  97. package/services/subscan-service/index.d.ts +13 -27
  98. package/services/subscan-service/index.js +26 -95
  99. package/services/transaction-service/helpers/index.js +2 -0
  100. package/services/transaction-service/index.js +15 -0
  101. package/services/transaction-service/utils.js +11 -2
  102. package/strategy/api-request-strategy/context/base.d.ts +2 -6
  103. package/strategy/api-request-strategy/index.js +1 -0
  104. package/strategy/api-request-strategy/types.d.ts +4 -2
  105. package/strategy/api-request-strategy/utils/index.js +2 -2
  106. package/strategy/api-request-strategy-v2/index.d.ts +22 -0
  107. package/strategy/api-request-strategy-v2/index.js +128 -0
  108. package/strategy/api-request-strategy-v2/types.d.ts +11 -0
  109. package/strategy/api-request-strategy-v2/types.js +1 -0
  110. package/types/buy.d.ts +1 -1
  111. package/types/transaction/error.d.ts +2 -1
  112. package/types/transaction/error.js +1 -0
  113. package/types/yield/actions/join/submit.d.ts +10 -1
  114. package/types/yield/info/chain/info.d.ts +2 -0
  115. package/utils/account/transform.js +3 -2
  116. package/utils/gear/combine.d.ts +2 -1
  117. package/utils/gear/combine.js +4 -4
  118. package/utils/gear/vft.d.ts +20 -9
  119. package/utils/gear/vft.js +104 -135
@@ -27,7 +27,8 @@ export default class AcalaLiquidStakingPoolHandler extends BaseLiquidStakingPool
27
27
  fastUnstake: true,
28
28
  cancelUnstake: false,
29
29
  withdraw: true,
30
- claimReward: false
30
+ claimReward: false,
31
+ changeValidator: false
31
32
  };
32
33
  constructor(state, chain) {
33
34
  super(state, chain);
@@ -32,7 +32,7 @@ export default class BifrostLiquidStakingPoolHandler extends BaseLiquidStakingPo
32
32
  protected readonly rewardAssets: string[];
33
33
  protected readonly feeAssets: string[];
34
34
  readonly minAmountPercent: number;
35
- protected readonly availableMethod: YieldPoolMethodInfo;
35
+ readonly availableMethod: YieldPoolMethodInfo;
36
36
  protected readonly rateDecimals = 0;
37
37
  constructor(state: KoniState, chain: string);
38
38
  protected getDescription(): string;
@@ -26,7 +26,8 @@ export default class BifrostLiquidStakingPoolHandler extends BaseLiquidStakingPo
26
26
  fastUnstake: true,
27
27
  cancelUnstake: false,
28
28
  withdraw: false,
29
- claimReward: false
29
+ claimReward: false,
30
+ changeValidator: false
30
31
  };
31
32
  rateDecimals = 0;
32
33
  constructor(state, chain) {
@@ -13,7 +13,7 @@ export default class ParallelLiquidStakingPoolHandler extends BaseLiquidStakingP
13
13
  protected readonly feeAssets: string[];
14
14
  readonly minAmountPercent = 0.96;
15
15
  protected readonly rateDecimals = 18;
16
- protected readonly availableMethod: YieldPoolMethodInfo;
16
+ readonly availableMethod: YieldPoolMethodInfo;
17
17
  constructor(state: KoniState, chain: string);
18
18
  protected getDescription(): string;
19
19
  getPoolStat(): Promise<LiquidYieldPoolInfo>;
@@ -22,7 +22,8 @@ export default class ParallelLiquidStakingPoolHandler extends BaseLiquidStakingP
22
22
  fastUnstake: true,
23
23
  cancelUnstake: false,
24
24
  withdraw: false,
25
- claimReward: false
25
+ claimReward: false,
26
+ changeValidator: false
26
27
  };
27
28
  constructor(state, chain) {
28
29
  super(state, chain);
@@ -17,7 +17,7 @@ export default class StellaSwapLiquidStakingPoolHandler extends BaseLiquidStakin
17
17
  protected readonly feeAssets: string[];
18
18
  transactionChainType: ChainType;
19
19
  protected readonly rateDecimals = 10;
20
- protected readonly availableMethod: YieldPoolMethodInfo;
20
+ readonly availableMethod: YieldPoolMethodInfo;
21
21
  constructor(state: KoniState, chain: string);
22
22
  protected getDescription(): string;
23
23
  getPoolStat(): Promise<LiquidYieldPoolInfo>;
@@ -33,7 +33,8 @@ export default class StellaSwapLiquidStakingPoolHandler extends BaseLiquidStakin
33
33
  fastUnstake: false,
34
34
  cancelUnstake: false,
35
35
  withdraw: true,
36
- claimReward: false
36
+ claimReward: false,
37
+ changeValidator: false
37
38
  };
38
39
  constructor(state, chain) {
39
40
  super(state, chain);
@@ -7,6 +7,7 @@ import BaseParaNativeStakingPoolHandler from './base-para';
7
7
  export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeStakingPoolHandler {
8
8
  subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
9
9
  parseNominatorMetadata(chainInfo: _ChainInfo, address: string, substrateApi: _SubstrateApi, delegatorState: ParachainStakingStakeOption[], unstakingInfo: Record<string, number>): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
10
+ checkAccountHaveStake(useAddresses: string[]): Promise<string[]>;
10
11
  subscribePoolPosition(useAddresses: string[], resultCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
11
12
  getPoolReward(useAddresses: string[], callBack: (rs: EarningRewardItem) => void): Promise<VoidFunction>;
12
13
  getKrestPoolTargets(chainApi: _SubstrateApi): Promise<ValidatorInfo[]>;
@@ -171,6 +171,38 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
171
171
  unstakings: unstakingList
172
172
  };
173
173
  }
174
+ async checkAccountHaveStake(useAddresses) {
175
+ var _substrateApi$api$que, _substrateApi$api$que2, _substrateApi$api$que3, _substrateApi$api$que4, _substrateApi$api$que5, _substrateApi$api$que6;
176
+ const result = [];
177
+ const substrateApi = await this.substrateApi.isReady;
178
+ const ledgers = await ((_substrateApi$api$que = substrateApi.api.query.parachainStaking) === null || _substrateApi$api$que === void 0 ? void 0 : (_substrateApi$api$que2 = _substrateApi$api$que.delegatorState) === null || _substrateApi$api$que2 === void 0 ? void 0 : (_substrateApi$api$que3 = _substrateApi$api$que2.multi) === null || _substrateApi$api$que3 === void 0 ? void 0 : _substrateApi$api$que3.call(_substrateApi$api$que2, useAddresses));
179
+ const _unstakingStates = await ((_substrateApi$api$que4 = substrateApi.api.query.parachainStaking) === null || _substrateApi$api$que4 === void 0 ? void 0 : (_substrateApi$api$que5 = _substrateApi$api$que4.unstaking) === null || _substrateApi$api$que5 === void 0 ? void 0 : (_substrateApi$api$que6 = _substrateApi$api$que5.multi) === null || _substrateApi$api$que6 === void 0 ? void 0 : _substrateApi$api$que6.call(_substrateApi$api$que5, useAddresses));
180
+ if (!ledgers || !_unstakingStates) {
181
+ return [];
182
+ }
183
+ for (let i = 0; i < useAddresses.length; i++) {
184
+ const owner = useAddresses[i];
185
+ const _delegatorState = ledgers[i];
186
+ let delegatorState = [];
187
+ const unstakingInfo = _unstakingStates[i].toPrimitive();
188
+ if (_STAKING_CHAIN_GROUP.krest_network.includes(this.chain)) {
189
+ const krestDelegatorState = _delegatorState.toPrimitive();
190
+ const delegates = krestDelegatorState === null || krestDelegatorState === void 0 ? void 0 : krestDelegatorState.delegations;
191
+ if (delegates) {
192
+ delegatorState = delegatorState.concat(delegates);
193
+ }
194
+ } else {
195
+ const delegate = _delegatorState.toPrimitive();
196
+ if (delegate) {
197
+ delegatorState.push(delegate);
198
+ }
199
+ }
200
+ if (delegatorState.length || unstakingInfo && Object.keys(unstakingInfo).length) {
201
+ result.push(owner);
202
+ }
203
+ }
204
+ return Promise.resolve(result);
205
+ }
174
206
  async subscribePoolPosition(useAddresses, resultCallback) {
175
207
  let cancel = false;
176
208
  const substrateApi = await this.substrateApi.isReady;
@@ -5,10 +5,11 @@ import { BaseYieldPositionInfo, PalletDappsStakingAccountLedger, StakeCancelWith
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 readonly availableMethod: YieldPoolMethodInfo;
8
+ readonly availableMethod: YieldPoolMethodInfo;
9
9
  subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
10
10
  parseNominatorMetadata(chainInfo: _ChainInfo, address: string, substrateApi: _SubstrateApi, ledger: PalletDappsStakingAccountLedger): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
11
11
  subscribePoolPosition(useAddresses: string[], resultCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
12
+ checkAccountHaveStake(useAddresses: string[]): Promise<Array<string>>;
12
13
  getPoolTargets(): Promise<ValidatorInfo[]>;
13
14
  get defaultSubmitStep(): YieldStepBaseInfo;
14
15
  createJoinExtrinsic(data: SubmitJoinNativeStaking, positionInfo?: YieldPositionInfo, bondDest?: string): Promise<[TransactionData, YieldTokenBaseInfo]>;
@@ -39,7 +39,8 @@ export default class AstarNativeStakingPoolHandler extends BaseParaNativeStaking
39
39
  fastUnstake: false,
40
40
  cancelUnstake: false,
41
41
  withdraw: true,
42
- claimReward: true
42
+ claimReward: true,
43
+ changeValidator: false
43
44
  };
44
45
 
45
46
  /* Subscribe pool info */
@@ -286,6 +287,24 @@ export default class AstarNativeStakingPoolHandler extends BaseParaNativeStaking
286
287
  unsub && unsub();
287
288
  };
288
289
  }
290
+ async checkAccountHaveStake(useAddresses) {
291
+ var _substrateApi$api$que2, _substrateApi$api$que3, _substrateApi$api$que4;
292
+ const result = [];
293
+ const substrateApi = await this.substrateApi.isReady;
294
+ const ledgers = await ((_substrateApi$api$que2 = substrateApi.api.query.dappsStaking) === null || _substrateApi$api$que2 === void 0 ? void 0 : (_substrateApi$api$que3 = _substrateApi$api$que2.ledger) === null || _substrateApi$api$que3 === void 0 ? void 0 : (_substrateApi$api$que4 = _substrateApi$api$que3.multi) === null || _substrateApi$api$que4 === void 0 ? void 0 : _substrateApi$api$que4.call(_substrateApi$api$que3, useAddresses));
295
+ if (!ledgers) {
296
+ return [];
297
+ }
298
+ for (let i = 0; i < useAddresses.length; i++) {
299
+ const owner = useAddresses[i];
300
+ const _ledger = ledgers[i];
301
+ const ledger = _ledger.toPrimitive();
302
+ if (ledger && ledger.locked > 0) {
303
+ result.push(owner);
304
+ }
305
+ }
306
+ return result;
307
+ }
289
308
 
290
309
  /* Subscribe pool position */
291
310
 
@@ -1,17 +1,18 @@
1
1
  import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
2
2
  import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
3
- import { EarningRewardHistoryItem, EarningRewardItem, HandleYieldStepData, OptimalYieldPath, OptimalYieldPathParams, SubmitJoinNativeStaking, SubmitYieldJoinData, TransactionData, YieldPoolMethodInfo, YieldPoolType, YieldPositionInfo, YieldStepBaseInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
3
+ import { EarningRewardHistoryItem, EarningRewardItem, HandleYieldStepData, OptimalYieldPath, OptimalYieldPathParams, SubmitChangeValidatorStaking, SubmitJoinNativeStaking, SubmitYieldJoinData, TransactionData, YieldPoolMethodInfo, 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
7
  protected readonly name: string;
8
8
  protected readonly shortName: string;
9
9
  slug: string;
10
- protected readonly availableMethod: YieldPoolMethodInfo;
10
+ availableMethod: YieldPoolMethodInfo;
11
11
  static generateSlug(symbol: string, chain: string): string;
12
12
  constructor(state: KoniState, chain: string);
13
13
  protected getDescription(amount?: string): string;
14
14
  getPoolReward(useAddresses: string[], callBack: (rs: EarningRewardItem) => void): Promise<VoidFunction>;
15
+ abstract checkAccountHaveStake(useAddresses: string[]): Promise<Array<string>>;
15
16
  getPoolRewardHistory(useAddresses: string[], callBack: (rs: EarningRewardHistoryItem) => void): Promise<VoidFunction>;
16
17
  get defaultSubmitStep(): YieldStepBaseInfo;
17
18
  abstract createJoinExtrinsic(data: SubmitJoinNativeStaking, positionInfo?: YieldPositionInfo, bondDest?: string, netuid?: number): Promise<[TransactionData, YieldTokenBaseInfo]>;
@@ -19,4 +20,5 @@ export default abstract class BaseNativeStakingPoolHandler extends BasePoolHandl
19
20
  handleYieldJoin(_data: SubmitYieldJoinData, path: OptimalYieldPath, currentStep: number): Promise<HandleYieldStepData>;
20
21
  handleYieldRedeem(amount: string, address: string, selectedTarget?: string): Promise<[ExtrinsicType, TransactionData]>;
21
22
  handleYieldClaimReward(address: string, bondReward?: boolean): Promise<TransactionData>;
23
+ handleChangeEarningValidator(_data: SubmitChangeValidatorStaking): Promise<TransactionData>;
22
24
  }
@@ -14,7 +14,8 @@ export default class BaseNativeStakingPoolHandler extends BasePoolHandler {
14
14
  fastUnstake: false,
15
15
  cancelUnstake: true,
16
16
  withdraw: true,
17
- claimReward: false
17
+ claimReward: false,
18
+ changeValidator: false
18
19
  };
19
20
  static generateSlug(symbol, chain) {
20
21
  return `${symbol}___native_staking___${chain}`;
@@ -42,40 +43,48 @@ export default class BaseNativeStakingPoolHandler extends BasePoolHandler {
42
43
  async getPoolRewardHistory(useAddresses, callBack) {
43
44
  let cancel = false;
44
45
  const haveSubscanService = this.state.subscanService.checkSupportedSubscanChain(this.chain);
46
+ const requestGroupId = this.state.subscanService.getGroupId();
45
47
  if (haveSubscanService) {
46
- for (const address of useAddresses) {
47
- if (cancel) {
48
- break;
49
- }
50
- try {
51
- const rs = await this.state.subscanService.getRewardHistoryList(this.chain, address);
52
- const items = rs === null || rs === void 0 ? void 0 : rs.list;
53
- if (items) {
54
- for (const item of items) {
55
- const now = new Date();
56
- const isMillisecond = now.getTime().toString().length === item.block_timestamp.toString().length;
57
- const timeStamp = isMillisecond ? item.block_timestamp : item.block_timestamp * 1000;
58
- const data = {
59
- slug: this.slug,
60
- type: this.type,
61
- chain: this.chain,
62
- address: address,
63
- group: this.group,
64
- blockTimestamp: timeStamp,
65
- amount: item.amount,
66
- eventIndex: item.event_index
67
- };
68
- callBack(data);
69
- }
48
+ this.checkAccountHaveStake(useAddresses).then(activeAddresses => {
49
+ for (const address of useAddresses) {
50
+ if (cancel) {
51
+ break;
52
+ }
53
+ if (!activeAddresses.includes(address)) {
54
+ continue;
70
55
  }
71
- } catch (e) {
72
- console.error(e);
56
+ this.state.subscanService.getRewardHistoryList(requestGroupId, this.chain, address).then(rs => {
57
+ const items = rs === null || rs === void 0 ? void 0 : rs.list;
58
+ if (cancel) {
59
+ return;
60
+ }
61
+ if (items) {
62
+ for (const item of items) {
63
+ const now = new Date();
64
+ const isMillisecond = now.getTime().toString().length === item.block_timestamp.toString().length;
65
+ const timeStamp = isMillisecond ? item.block_timestamp : item.block_timestamp * 1000;
66
+ const data = {
67
+ slug: this.slug,
68
+ type: this.type,
69
+ chain: this.chain,
70
+ address: address,
71
+ group: this.group,
72
+ blockTimestamp: timeStamp,
73
+ amount: item.amount,
74
+ eventIndex: item.event_index
75
+ };
76
+ callBack(data);
77
+ }
78
+ }
79
+ }).catch(console.error);
73
80
  }
74
- }
81
+ }).catch(console.error);
75
82
  }
76
- return () => {
83
+ return Promise.resolve(() => {
84
+ console.log('Cancel get pool reward history', requestGroupId);
77
85
  cancel = false;
78
- };
86
+ this.state.subscanService.cancelGroupRequest(requestGroupId);
87
+ });
79
88
  }
80
89
 
81
90
  /* Get pool reward */
@@ -156,6 +165,9 @@ export default class BaseNativeStakingPoolHandler extends BasePoolHandler {
156
165
  async handleYieldClaimReward(address, bondReward) {
157
166
  return Promise.reject(new TransactionError(BasicTxErrorType.UNSUPPORTED));
158
167
  }
168
+ async handleChangeEarningValidator(_data) {
169
+ return Promise.reject(new TransactionError(BasicTxErrorType.UNSUPPORTED));
170
+ }
159
171
 
160
172
  /* Other actions */
161
173
  }
@@ -3,7 +3,7 @@ import { TransactionError } from '@subwallet/extension-base/background/errors/Tr
3
3
  import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
4
4
  import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
5
5
  import BaseParaStakingPoolHandler from '@subwallet/extension-base/services/earning-service/handlers/native-staking/base-para';
6
- import { BaseYieldPositionInfo, OptimalYieldPath, RequestEarningSlippage, StakeCancelWithdrawalParams, SubmitJoinNativeStaking, TransactionData, UnstakingInfo, ValidatorInfo, YieldPoolInfo, YieldPoolMethodInfo, YieldPoolType, YieldPositionInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
6
+ import { BaseYieldPositionInfo, OptimalYieldPath, RequestEarningSlippage, StakeCancelWithdrawalParams, SubmitBittensorChangeValidatorStaking, SubmitJoinNativeStaking, TransactionData, UnstakingInfo, ValidatorInfo, YieldPoolInfo, YieldPoolMethodInfo, YieldPoolType, YieldPositionInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
7
7
  import BigN from 'bignumber.js';
8
8
  export interface SubnetData {
9
9
  netuid: number;
@@ -40,7 +40,7 @@ export interface EarningSlippageResult {
40
40
  slippage: number;
41
41
  rate: number;
42
42
  }
43
- export declare const DEFAULT_DTAO_MINBOND = "600000";
43
+ export declare const DEFAULT_DTAO_MINBOND = "21000000";
44
44
  export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHandler {
45
45
  handleYieldWithdraw(address: string, unstakingInfo: UnstakingInfo): Promise<TransactionData>;
46
46
  handleYieldCancelUnstake(params: StakeCancelWithdrawalParams): Promise<TransactionData>;
@@ -61,12 +61,14 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
61
61
  subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
62
62
  parseNominatorMetadata(chainInfo: _ChainInfo, address: string, delegatorState: TaoStakingStakeOption[]): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
63
63
  subscribePoolPosition(useAddresses: string[], rsCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
64
+ checkAccountHaveStake(useAddresses: string[]): Promise<string[]>;
64
65
  private getDevnetPoolTargets;
65
66
  private getMainnetPoolTargets;
66
- getPoolTargets(): Promise<ValidatorInfo[]>;
67
+ getPoolTargets(netuid: number): Promise<ValidatorInfo[]>;
67
68
  createJoinExtrinsic(data: SubmitJoinNativeStaking, positionInfo?: YieldPositionInfo, bondDest?: string): Promise<[TransactionData, YieldTokenBaseInfo]>;
68
69
  validateYieldJoin(data: SubmitJoinNativeStaking, path: OptimalYieldPath): Promise<TransactionError[]>;
69
70
  handleYieldUnstake(amount: string, address: string, selectedTarget?: string, netuid?: number, slippage?: number): Promise<[ExtrinsicType, TransactionData]>;
70
71
  validateYieldLeave(amount: string, address: string, fastLeave: boolean, selectedTarget?: string, slug?: string, poolInfo?: YieldPoolInfo): Promise<TransactionError[]>;
72
+ handleChangeEarningValidator(data: SubmitBittensorChangeValidatorStaking): Promise<TransactionData>;
71
73
  }
72
74
  export {};
@@ -7,15 +7,14 @@ import { BITTENSOR_REFRESH_STAKE_APY, BITTENSOR_REFRESH_STAKE_INFO } from '@subw
7
7
  import { getEarningStatusByNominations } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
8
8
  import { _getAssetDecimals, _getAssetSymbol } from '@subwallet/extension-base/services/chain-service/utils';
9
9
  import BaseParaStakingPoolHandler from '@subwallet/extension-base/services/earning-service/handlers/native-staking/base-para';
10
- import { BasicTxErrorType, EarningStatus, YieldPoolType } from '@subwallet/extension-base/types';
10
+ import { BasicTxErrorType, EarningStatus, StakingTxErrorType, YieldPoolType } from '@subwallet/extension-base/types';
11
11
  import { formatNumber, reformatAddress } from '@subwallet/extension-base/utils';
12
12
  import BigN from 'bignumber.js';
13
13
  import { t } from 'i18next';
14
14
  import { BN, BN_ZERO } from '@polkadot/util';
15
- import { calculateReward } from "../../utils/index.js";
16
15
  import { BittensorCache } from "./tao.js";
17
16
  const DEFAULT_BITTENSOR_SLIPPAGE = 0.005;
18
- export const DEFAULT_DTAO_MINBOND = '600000';
17
+ export const DEFAULT_DTAO_MINBOND = '21000000';
19
18
  const getAlphaToTaoMapping = async substrateApi => {
20
19
  const allSubnets = (await substrateApi.api.call.subnetInfoRuntimeApi.getAllDynamicInfo()).toJSON();
21
20
  if (!allSubnets || allSubnets.length === 0) {
@@ -62,7 +61,8 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
62
61
  fastUnstake: false,
63
62
  cancelUnstake: false,
64
63
  withdraw: false,
65
- claimReward: false
64
+ claimReward: false,
65
+ changeValidator: true
66
66
  };
67
67
  constructor(state, chain) {
68
68
  super(state, chain);
@@ -364,6 +364,11 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
364
364
  };
365
365
  }
366
366
 
367
+ // Because not have subscan api
368
+ async checkAccountHaveStake(useAddresses) {
369
+ return Promise.resolve([]);
370
+ }
371
+
367
372
  /* Subscribe pool position */
368
373
 
369
374
  /* Get pool targets */
@@ -388,32 +393,37 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
388
393
  isCrowded: false
389
394
  }));
390
395
  }
391
- async getMainnetPoolTargets() {
396
+ async getMainnetPoolTargets(netuid) {
392
397
  const _topValidator = await this.bittensorCache.get();
393
398
  const topValidator = _topValidator;
394
399
  const bnMinBond = new BigN(DEFAULT_DTAO_MINBOND);
395
400
  const validatorList = topValidator.data;
396
- const validatorAddresses = Object.keys(validatorList);
397
- const results = await Promise.all(validatorAddresses.map(i => {
398
- const address = validatorList[i].hotkey.ss58;
399
- const bnTotalStake = new BigN(validatorList[i].stake);
400
- const bnOwnStake = new BigN(validatorList[i].validator_stake);
401
- const otherStake = bnTotalStake.minus(bnOwnStake);
402
- const nominatorCount = validatorList[i].nominators;
403
- const commission = validatorList[i].take;
401
+ const aprResponse = await this.bittensorCache.fetchApr(netuid);
402
+ const aprMap = {};
403
+ aprResponse.data.forEach(item => {
404
+ aprMap[item.hotkey.ss58] = item.thirty_day_apy;
405
+ });
406
+ const results = await Promise.all(validatorList.map(validator => {
407
+ const address = validator.hotkey.ss58;
408
+ // With bittensor we use total weight, root weight and alpha staked insted of total stake, own stake and other stake
409
+ const bnTotalWeightStake = new BigN(validator.global_weighted_stake);
410
+ const bnRootWeightStake = new BigN(validator.weighted_root_stake);
411
+ const bnAlphaStake = new BigN(validator.global_alpha_stake_as_tao);
412
+ const nominatorCount = validator.global_nominators;
413
+ const commission = validator.take;
404
414
  const roundedCommission = (parseFloat(commission) * 100).toFixed(0);
405
- const apr = (parseFloat(validatorList[i].apr) / 10 ** 9 * 100).toFixed(2);
406
- const apyCalculate = calculateReward(parseFloat(apr));
407
- const name = validatorList[i].name || address;
415
+ const apr = aprMap[address];
416
+ const expectedReturn = apr ? new BigN(apr).multipliedBy(100).toFixed(2) : '0';
417
+ const name = validator.name || address;
408
418
  return {
409
419
  address: address,
410
- totalStake: bnTotalStake.toString(),
411
- ownStake: bnOwnStake.toString(),
412
- otherStake: otherStake.toString(),
420
+ totalStake: bnTotalWeightStake.toString(),
421
+ ownStake: bnRootWeightStake.toString(),
422
+ otherStake: bnAlphaStake.toString(),
413
423
  minBond: bnMinBond.toString(),
414
424
  nominatorCount: nominatorCount,
415
425
  commission: roundedCommission,
416
- expectedReturn: apyCalculate.apy,
426
+ expectedReturn: expectedReturn,
417
427
  blocked: false,
418
428
  isVerified: false,
419
429
  chain: this.chain,
@@ -423,10 +433,10 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
423
433
  }));
424
434
  return results;
425
435
  }
426
- async getPoolTargets() {
436
+ async getPoolTargets(netuid) {
427
437
  await this.init();
428
438
  if (this.chain === 'bittensor') {
429
- return this.getMainnetPoolTargets();
439
+ return this.getMainnetPoolTargets(netuid);
430
440
  } else {
431
441
  return this.getDevnetPoolTargets();
432
442
  }
@@ -442,6 +452,9 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
442
452
  selectedValidators: targetValidators,
443
453
  subnetData
444
454
  } = data;
455
+ if (!subnetData) {
456
+ throw new Error(BasicTxErrorType.INVALID_PARAMS);
457
+ }
445
458
  const {
446
459
  netuid,
447
460
  slippage
@@ -451,6 +464,8 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
451
464
  const alphaToTaoPrice = new BigN(await getAlphaToTaoRate(this.substrateApi, netuid));
452
465
  const limitPrice = alphaToTaoPrice.multipliedBy(10 ** _getAssetDecimals(this.nativeToken)).multipliedBy(1 + (slippage || DEFAULT_BITTENSOR_SLIPPAGE));
453
466
  const BNlimitPrice = new BigN(limitPrice.integerValue(BigN.ROUND_CEIL).toFixed());
467
+
468
+ // Bittensor only supports changing 1 validator at a time, not multiple
454
469
  const selectedValidatorInfo = targetValidators[0];
455
470
  const hotkey = selectedValidatorInfo.address;
456
471
  const extrinsic = chainApi.api.tx.subtensorModule.addStakeLimit(hotkey, netuid, binaryAmount.toFixed(), BNlimitPrice.toFixed(), false);
@@ -459,6 +474,8 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
459
474
  amount: '0'
460
475
  }];
461
476
  }
477
+
478
+ // Validate for case stake more
462
479
  async validateYieldJoin(data, path) {
463
480
  const baseErrors = await super.validateYieldJoin(data, path);
464
481
  if (baseErrors.length > 0) {
@@ -510,4 +527,45 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
510
527
  }
511
528
 
512
529
  /* Leave pool action */
530
+
531
+ /* Change validator */
532
+ async handleChangeEarningValidator(data) {
533
+ const chainApi = await this.substrateApi.isReady;
534
+ const {
535
+ amount,
536
+ maxAmount,
537
+ metadata,
538
+ originValidator,
539
+ selectedValidators: targetValidators,
540
+ subnetData
541
+ } = data;
542
+ if (!subnetData || !originValidator) {
543
+ return Promise.reject(new TransactionError(BasicTxErrorType.INVALID_PARAMS));
544
+ }
545
+ const {
546
+ netuid
547
+ } = subnetData;
548
+ const selectedValidatorInfo = targetValidators[0];
549
+ const destValidator = selectedValidatorInfo.address;
550
+ if (new BigN(amount).lte(0)) {
551
+ return Promise.reject(new TransactionError(BasicTxErrorType.INVALID_PARAMS, t('Amount must be greater than 0')));
552
+ }
553
+ if (originValidator === destValidator) {
554
+ return Promise.reject(new TransactionError(BasicTxErrorType.INVALID_PARAMS, 'From validator is the same with to validator'));
555
+ }
556
+ const alphaToTaoPrice = new BigN(await getAlphaToTaoRate(this.substrateApi, netuid || 0));
557
+ const minUnstake = new BigN(DEFAULT_DTAO_MINBOND).dividedBy(alphaToTaoPrice);
558
+ const formattedMinUnstake = minUnstake.dividedBy(1000000).integerValue(BigN.ROUND_CEIL).dividedBy(1000);
559
+ const bnMinUnstake = formattedMinUnstake.multipliedBy(10 ** _getAssetDecimals(this.nativeToken));
560
+ if (new BigN(maxAmount).lt(bnMinUnstake)) {
561
+ return Promise.reject(new TransactionError(BasicTxErrorType.INVALID_PARAMS, t(`Amount too low. You need to move at least ${formattedMinUnstake.toString()} ${(metadata === null || metadata === void 0 ? void 0 : metadata.subnetSymbol) || ''}`)));
562
+ }
563
+
564
+ // Avoid remaining amount too low -> can't do anything with that amount
565
+ if (!(maxAmount === amount) && new BigN(maxAmount).minus(new BigN(amount)).lt(bnMinUnstake)) {
566
+ return Promise.reject(new TransactionError(StakingTxErrorType.REMAINING_AMOUNT_TOO_LOW, t(`Your remaining stake on the initial validator will fall below minimum active stake and cannot be unstaked if you proceed with the chosen amount. Hit "Move all" to move all ${formatNumber(maxAmount, _getAssetDecimals(this.nativeToken))} ${(metadata === null || metadata === void 0 ? void 0 : metadata.subnetSymbol) || ''} to the new validator, or "Cancel" and lower the amount, then try again`)));
567
+ }
568
+ const extrinsic = chainApi.api.tx.subtensorModule.moveStake(originValidator, destValidator, netuid, netuid, amount);
569
+ return extrinsic;
570
+ }
513
571
  }
@@ -11,8 +11,9 @@ interface PalletCollatorStakingUserStakeInfo {
11
11
  maybeLastRewardSession: string;
12
12
  }
13
13
  export default class MythosNativeStakingPoolHandler extends BaseParaStakingPoolHandler {
14
- protected readonly availableMethod: YieldPoolMethodInfo;
14
+ readonly availableMethod: YieldPoolMethodInfo;
15
15
  subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
16
+ checkAccountHaveStake(useAddresses: string[]): Promise<Array<string>>;
16
17
  subscribePoolPosition(useAddresses: string[], resultCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
17
18
  parseCollatorMetadata(chainInfo: _ChainInfo, stakerAddress: string, substrateApi: _SubstrateApi, userStake: PalletCollatorStakingUserStakeInfo): Promise<{
18
19
  status: EarningStatus;
@@ -30,7 +30,8 @@ export default class MythosNativeStakingPoolHandler extends BaseParaStakingPoolH
30
30
  fastUnstake: false,
31
31
  cancelUnstake: false,
32
32
  withdraw: true,
33
- claimReward: true
33
+ claimReward: true,
34
+ changeValidator: false
34
35
  };
35
36
 
36
37
  /* Subscribe pool info */
@@ -119,6 +120,34 @@ export default class MythosNativeStakingPoolHandler extends BaseParaStakingPoolH
119
120
 
120
121
  /* Subscribe pool position */
121
122
 
123
+ async checkAccountHaveStake(useAddresses) {
124
+ var _substrateApi$api$que, _substrateApi$api$que2, _substrateApi$api$que3;
125
+ const result = [];
126
+ const substrateApi = await this.substrateApi.isReady;
127
+ const ledgers = await ((_substrateApi$api$que = substrateApi.api.query.collatorStaking) === null || _substrateApi$api$que === void 0 ? void 0 : (_substrateApi$api$que2 = _substrateApi$api$que.userStake) === null || _substrateApi$api$que2 === void 0 ? void 0 : (_substrateApi$api$que3 = _substrateApi$api$que2.multi) === null || _substrateApi$api$que3 === void 0 ? void 0 : _substrateApi$api$que3.call(_substrateApi$api$que2, useAddresses));
128
+ const _unstakings = await Promise.all(useAddresses.map(stakerAddress => {
129
+ var _substrateApi$api$que4, _substrateApi$api$que5;
130
+ return (_substrateApi$api$que4 = substrateApi.api.query.collatorStaking) === null || _substrateApi$api$que4 === void 0 ? void 0 : (_substrateApi$api$que5 = _substrateApi$api$que4.releaseQueues) === null || _substrateApi$api$que5 === void 0 ? void 0 : _substrateApi$api$que5.call(_substrateApi$api$que4, stakerAddress);
131
+ }));
132
+ if (!ledgers || !_unstakings) {
133
+ return [];
134
+ }
135
+ for (let i = 0; i < useAddresses.length; i++) {
136
+ const owner = useAddresses[i];
137
+ const _userStake = ledgers[i];
138
+ const userStake = _userStake.toPrimitive();
139
+ const _unstaking = _unstakings[i];
140
+ const unstakings = _unstaking.toPrimitive();
141
+
142
+ // TODO: Need to improve, check if can only load stake info
143
+ if (userStake && userStake.stake !== '0') {
144
+ result.push(owner);
145
+ } else if (unstakings && unstakings.some(unstake => unstake.amount !== '0')) {
146
+ result.push(owner);
147
+ }
148
+ }
149
+ return result;
150
+ }
122
151
  async subscribePoolPosition(useAddresses, resultCallback) {
123
152
  let cancel = false;
124
153
  const substrateApi = await this.substrateApi.isReady;
@@ -7,6 +7,7 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
7
7
  subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
8
8
  parseNominatorMetadata(chainInfo: _ChainInfo, address: string, substrateApi: _SubstrateApi, delegatorState: PalletParachainStakingDelegator): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
9
9
  subscribePoolPosition(useAddresses: string[], resultCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
10
+ checkAccountHaveStake(useAddresses: string[]): Promise<string[]>;
10
11
  getMantaPoolTargets(): Promise<ValidatorInfo[]>;
11
12
  getParachainPoolTargets(): Promise<ValidatorInfo[]>;
12
13
  getPoolTargets(): Promise<ValidatorInfo[]>;
@@ -268,6 +268,23 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
268
268
  unsub();
269
269
  };
270
270
  }
271
+ async checkAccountHaveStake(useAddresses) {
272
+ var _substrateApi$api$que, _substrateApi$api$que2, _substrateApi$api$que3;
273
+ const result = [];
274
+ const substrateApi = await this.substrateApi.isReady;
275
+ const ledgers = await ((_substrateApi$api$que = substrateApi.api.query.parachainStaking) === null || _substrateApi$api$que === void 0 ? void 0 : (_substrateApi$api$que2 = _substrateApi$api$que.delegatorState) === null || _substrateApi$api$que2 === void 0 ? void 0 : (_substrateApi$api$que3 = _substrateApi$api$que2.multi) === null || _substrateApi$api$que3 === void 0 ? void 0 : _substrateApi$api$que3.call(_substrateApi$api$que2, useAddresses));
276
+ if (!ledgers) {
277
+ return [];
278
+ }
279
+ for (let i = 0; i < useAddresses.length; i++) {
280
+ const owner = useAddresses[i];
281
+ const delegatorState = ledgers[i].toPrimitive();
282
+ if (delegatorState && delegatorState.total > 0) {
283
+ result.push(owner);
284
+ }
285
+ }
286
+ return result;
287
+ }
271
288
 
272
289
  /* Subscribe pool position */
273
290
 
@@ -2,16 +2,20 @@
2
2
  import { _ChainInfo } from '@subwallet/chain-list/types';
3
3
  import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
4
4
  import { ExtrinsicType, NominationInfo, UnstakingInfo } from '@subwallet/extension-base/background/KoniTypes';
5
+ import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
5
6
  import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
6
- import { BaseYieldPositionInfo, OptimalYieldPath, PalletStakingNominations, PalletStakingStakingLedger, StakeCancelWithdrawalParams, SubmitJoinNativeStaking, SubmitYieldJoinData, TransactionData, ValidatorInfo, YieldPoolInfo, YieldPositionInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
7
+ import { BaseYieldPositionInfo, OptimalYieldPath, PalletStakingNominations, PalletStakingStakingLedger, StakeCancelWithdrawalParams, SubmitChangeValidatorStaking, SubmitJoinNativeStaking, SubmitYieldJoinData, TransactionData, ValidatorInfo, YieldPoolInfo, YieldPoolMethodInfo, YieldPositionInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
7
8
  import { DeriveSessionProgress } from '@polkadot/api-derive/types';
8
9
  import { BN } from '@polkadot/util';
9
10
  import BaseNativeStakingPoolHandler from './base';
10
11
  export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPoolHandler {
12
+ availableMethod: YieldPoolMethodInfo;
13
+ constructor(state: KoniState, chain: string);
11
14
  subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
12
15
  parseNominatorMetadata(chainInfo: _ChainInfo, address: string, substrateApi: _SubstrateApi, ledger: PalletStakingStakingLedger, currentEra: string, minStake: BN, _deriveSessionProgress: DeriveSessionProgress): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
13
16
  handleNominationsList(substrateApi: _SubstrateApi, chain: string, nominations: PalletStakingNominations, currentEra: string, address: string, maxNominatorRewardedPerValidator: number | undefined): Promise<NominationInfo[]>;
14
17
  subscribePoolPosition(useAddresses: string[], resultCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
18
+ checkAccountHaveStake(useAddresses: string[]): Promise<string[]>;
15
19
  getPoolTargets(): Promise<ValidatorInfo[]>;
16
20
  private getValidatorExpectedReturn;
17
21
  private parseEraStakerData;
@@ -21,4 +25,5 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
21
25
  handleYieldUnstake(amount: string, address: string, selectedTarget?: string): Promise<[ExtrinsicType, TransactionData]>;
22
26
  handleYieldCancelUnstake(params: StakeCancelWithdrawalParams): Promise<TransactionData>;
23
27
  handleYieldWithdraw(address: string, unstakingInfo: UnstakingInfo): Promise<TransactionData>;
28
+ handleChangeEarningValidator(data: SubmitChangeValidatorStaking): Promise<TransactionData>;
24
29
  }