@subwallet/extension-base 1.3.51-0 → 1.3.52-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 (53) hide show
  1. package/cjs/constants/environment.js +3 -1
  2. package/cjs/koni/background/handlers/State.js +1 -5
  3. package/cjs/packageInfo.js +1 -1
  4. package/cjs/services/balance-service/index.js +3 -4
  5. package/cjs/services/balance-service/transfer/cardano-transfer.js +43 -11
  6. package/cjs/services/balance-service/transfer/xcm/acrossBridge/index.js +13 -92
  7. package/cjs/services/balance-service/transfer/xcm/index.js +12 -4
  8. package/cjs/services/chain-service/utils/patch.js +3 -2
  9. package/cjs/services/earning-service/handlers/native-staking/dtao.js +28 -301
  10. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +4 -4
  11. package/cjs/services/earning-service/handlers/native-staking/tao.js +174 -148
  12. package/cjs/services/earning-service/handlers/nomination-pool/index.js +11 -5
  13. package/cjs/services/earning-service/service.js +5 -2
  14. package/cjs/services/fee-service/utils/tokenPayFee.js +17 -13
  15. package/cjs/services/price-service/coingecko.js +3 -3
  16. package/cjs/services/swap-service/handler/hydradx-handler.js +19 -13
  17. package/cjs/services/swap-service/index.js +8 -5
  18. package/cjs/services/transaction-service/utils.js +31 -22
  19. package/cjs/utils/index.js +12 -0
  20. package/cjs/utils/setup-api-sdk.js +27 -0
  21. package/constants/environment.d.ts +1 -0
  22. package/constants/environment.js +1 -0
  23. package/koni/background/handlers/State.js +3 -7
  24. package/package.json +12 -6
  25. package/packageInfo.js +1 -1
  26. package/services/balance-service/index.js +3 -4
  27. package/services/balance-service/transfer/cardano-transfer.js +42 -10
  28. package/services/balance-service/transfer/xcm/acrossBridge/index.js +14 -93
  29. package/services/balance-service/transfer/xcm/index.js +12 -4
  30. package/services/chain-service/utils/patch.d.ts +1 -0
  31. package/services/chain-service/utils/patch.js +1 -1
  32. package/services/earning-service/handlers/native-staking/dtao.d.ts +4 -36
  33. package/services/earning-service/handlers/native-staking/dtao.js +24 -298
  34. package/services/earning-service/handlers/native-staking/relay-chain.d.ts +1 -2
  35. package/services/earning-service/handlers/native-staking/relay-chain.js +4 -4
  36. package/services/earning-service/handlers/native-staking/tao.d.ts +25 -5
  37. package/services/earning-service/handlers/native-staking/tao.js +169 -149
  38. package/services/earning-service/handlers/nomination-pool/index.d.ts +1 -2
  39. package/services/earning-service/handlers/nomination-pool/index.js +11 -5
  40. package/services/earning-service/service.d.ts +1 -0
  41. package/services/earning-service/service.js +4 -2
  42. package/services/fee-service/utils/tokenPayFee.js +17 -13
  43. package/services/price-service/coingecko.js +2 -3
  44. package/services/swap-service/handler/hydradx-handler.js +19 -13
  45. package/services/swap-service/index.js +8 -5
  46. package/services/transaction-service/utils.d.ts +0 -1
  47. package/services/transaction-service/utils.js +31 -21
  48. package/types/swap/index.d.ts +1 -1
  49. package/types/yield/info/chain/info.d.ts +1 -0
  50. package/utils/index.d.ts +1 -0
  51. package/utils/index.js +2 -1
  52. package/utils/setup-api-sdk.d.ts +1 -0
  53. package/utils/setup-api-sdk.js +20 -0
@@ -1,10 +1,7 @@
1
1
  import { _ChainInfo } from '@subwallet/chain-list/types';
2
- import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
3
- import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
4
2
  import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
5
- import BaseParaStakingPoolHandler from '@subwallet/extension-base/services/earning-service/handlers/native-staking/base-para';
6
- import { BaseYieldPositionInfo, OptimalYieldPath, RequestEarningSlippage, StakeCancelWithdrawalParams, SubmitBittensorChangeValidatorStaking, SubmitJoinNativeStaking, TransactionData, UnstakingInfo, ValidatorInfo, YieldPoolInfo, YieldPoolMethodInfo, YieldPoolType, YieldPositionInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
7
- import BigN from 'bignumber.js';
3
+ import { BaseYieldPositionInfo, RequestEarningSlippage, YieldPoolInfo, YieldPoolType, YieldPositionInfo } from '@subwallet/extension-base/types';
4
+ import TaoNativeStakingPoolHandler, { TaoStakingStakeOption } from './tao';
8
5
  export interface SubnetData {
9
6
  netuid: number;
10
7
  name: string;
@@ -14,12 +11,6 @@ export interface SubnetData {
14
11
  taoIn: number;
15
12
  taoInEmission: number;
16
13
  }
17
- interface TaoStakingStakeOption {
18
- owner: string;
19
- amount: string;
20
- rate?: BigN;
21
- identity?: string;
22
- }
23
14
  export interface RawDelegateState {
24
15
  data: Array<{
25
16
  hotkey_name: string;
@@ -29,46 +20,23 @@ export interface RawDelegateState {
29
20
  stake: string;
30
21
  }>;
31
22
  }
32
- declare type Nominators = [Array<[number, number]>];
33
- export interface TestnetBittensorDelegateInfo {
34
- delegateSs58: string;
35
- take: number;
36
- nominators: Nominators;
37
- returnPer1000: number;
38
- }
39
23
  export interface EarningSlippageResult {
40
24
  slippage: number;
41
25
  rate: number;
42
26
  }
43
- export declare const DEFAULT_DTAO_MINBOND = "21000000";
44
- export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHandler {
45
- handleYieldWithdraw(address: string, unstakingInfo: UnstakingInfo): Promise<TransactionData>;
46
- handleYieldCancelUnstake(params: StakeCancelWithdrawalParams): Promise<TransactionData>;
27
+ export default class SubnetTaoStakingPoolHandler extends TaoNativeStakingPoolHandler {
47
28
  readonly type = YieldPoolType.SUBNET_STAKING;
48
29
  slug: string;
49
30
  protected name: string;
50
31
  protected shortName: string;
51
32
  subnetData: SubnetData[];
52
33
  private isInit;
53
- private bittensorCache;
54
- readonly availableMethod: YieldPoolMethodInfo;
55
34
  constructor(state: KoniState, chain: string);
56
35
  canHandleSlug(slug: string): boolean;
57
36
  getEarningSlippage(params: RequestEarningSlippage): Promise<EarningSlippageResult>;
58
- get maintainBalance(): string;
59
37
  private init;
60
38
  protected getDescription(): string;
61
39
  subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
62
- parseNominatorMetadata(chainInfo: _ChainInfo, address: string, delegatorState: TaoStakingStakeOption[]): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
40
+ parseNominatorMetadata(chainInfo: _ChainInfo, delegatorState: TaoStakingStakeOption[], netuid?: number): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
63
41
  subscribePoolPosition(useAddresses: string[], rsCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
64
- checkAccountHaveStake(useAddresses: string[]): Promise<string[]>;
65
- private getDevnetPoolTargets;
66
- private getMainnetPoolTargets;
67
- getPoolTargets(netuid: number): Promise<ValidatorInfo[]>;
68
- createJoinExtrinsic(data: SubmitJoinNativeStaking, positionInfo?: YieldPositionInfo, bondDest?: string): Promise<[TransactionData, YieldTokenBaseInfo]>;
69
- validateYieldJoin(data: SubmitJoinNativeStaking, path: OptimalYieldPath): Promise<TransactionError[]>;
70
- handleYieldUnstake(amount: string, address: string, selectedTarget?: string, netuid?: number, slippage?: number): Promise<[ExtrinsicType, TransactionData]>;
71
- validateYieldLeave(amount: string, address: string, fastLeave: boolean, selectedTarget?: string, slug?: string, poolInfo?: YieldPoolInfo): Promise<TransactionError[]>;
72
- handleChangeEarningValidator(data: SubmitBittensorChangeValidatorStaking): Promise<TransactionData>;
73
42
  }
74
- export {};
@@ -1,20 +1,13 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-base
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
5
4
  import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
6
5
  import { BITTENSOR_REFRESH_STAKE_APY, BITTENSOR_REFRESH_STAKE_INFO } from '@subwallet/extension-base/constants';
7
- import { getEarningStatusByNominations } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
8
- import { _getAssetDecimals, _getAssetSymbol } from '@subwallet/extension-base/services/chain-service/utils';
9
- import BaseParaStakingPoolHandler from '@subwallet/extension-base/services/earning-service/handlers/native-staking/base-para';
10
- import { BasicTxErrorType, EarningStatus, StakingTxErrorType, YieldPoolType } from '@subwallet/extension-base/types';
11
- import { formatNumber, reformatAddress } from '@subwallet/extension-base/utils';
6
+ import { EarningStatus, YieldPoolType } from '@subwallet/extension-base/types';
7
+ import { reformatAddress } from '@subwallet/extension-base/utils';
12
8
  import BigN from 'bignumber.js';
13
- import { t } from 'i18next';
14
9
  import { BN, BN_ZERO } from '@polkadot/util';
15
- import { BittensorCache } from "./tao.js";
16
- const DEFAULT_BITTENSOR_SLIPPAGE = 0.005;
17
- export const DEFAULT_DTAO_MINBOND = '21000000';
10
+ import TaoNativeStakingPoolHandler, { DEFAULT_DTAO_MINBOND } from "./tao.js";
18
11
  const getAlphaToTaoMapping = async substrateApi => {
19
12
  const allSubnets = (await substrateApi.api.call.subnetInfoRuntimeApi.getAllDynamicInfo()).toJSON();
20
13
  if (!allSubnets || allSubnets.length === 0) {
@@ -32,47 +25,18 @@ const getAlphaToTaoMapping = async substrateApi => {
32
25
  }
33
26
  return result;
34
27
  };
35
- const getAlphaToTaoRate = async (substrateApi, netuid) => {
36
- const subnetInfo = (await substrateApi.api.call.subnetInfoRuntimeApi.getDynamicInfo(netuid)).toJSON();
37
- if (!subnetInfo) {
38
- return '1';
39
- }
40
- const taoIn = subnetInfo.taoIn ? new BigN(subnetInfo.taoIn) : new BigN(0);
41
- const alphaIn = subnetInfo.alphaIn ? new BigN(subnetInfo.alphaIn) : new BigN(0);
42
- return netuid === 0 || alphaIn.lte(0) ? '1' : taoIn.dividedBy(alphaIn).toString();
43
- };
44
- export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHandler {
45
- /* Unimplemented function */
46
- handleYieldWithdraw(address, unstakingInfo) {
47
- throw new Error('Method not implemented.');
48
- }
49
- handleYieldCancelUnstake(params) {
50
- throw new Error('Method not implemented.');
51
- }
52
- /* Unimplemented function */
53
-
28
+ export default class SubnetTaoStakingPoolHandler extends TaoNativeStakingPoolHandler {
54
29
  // @ts-ignore
55
30
  type = YieldPoolType.SUBNET_STAKING;
56
31
  subnetData = [];
57
32
  isInit = false;
58
- availableMethod = {
59
- join: true,
60
- defaultUnstake: true,
61
- fastUnstake: false,
62
- cancelUnstake: false,
63
- withdraw: false,
64
- claimReward: false,
65
- changeValidator: true
66
- };
67
33
  constructor(state, chain) {
68
34
  super(state, chain);
69
- const _chainAsset = this.nativeToken;
70
- const _chainInfo = this.chainInfo;
71
- const symbol = _chainAsset.symbol;
72
- this.slug = this.slug = `${symbol}___subnet_staking___${_chainInfo.slug}`;
35
+ const symbol = this.nativeToken.symbol;
36
+ const chainSlug = this.chainInfo.slug;
37
+ this.slug = `${symbol}___subnet_staking___${chainSlug}`;
73
38
  this.name = 'Subnet Tao Staking';
74
39
  this.shortName = 'dTAO Staking';
75
- this.bittensorCache = BittensorCache.getInstance();
76
40
  }
77
41
  canHandleSlug(slug) {
78
42
  return slug.startsWith(`${this.slug}__`);
@@ -111,15 +75,9 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
111
75
  rate: 1
112
76
  };
113
77
  }
114
- get maintainBalance() {
115
- const ed = new BigN(this.nativeToken.minAmount || '0');
116
- const calculateMaintainBalance = new BigN(15).multipliedBy(ed).dividedBy(10);
117
- const maintainBalance = calculateMaintainBalance;
118
- return maintainBalance.toString();
119
- }
120
- async init() {
78
+ async init(forceRefresh = false) {
121
79
  try {
122
- if (this.isInit || !this.substrateApi) {
80
+ if (this.isInit && !forceRefresh || !this.substrateApi) {
123
81
  return;
124
82
  }
125
83
  const substrateApi = await this.substrateApi.isReady;
@@ -159,20 +117,20 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
159
117
  /* Subscribe pool info */
160
118
 
161
119
  async subscribePoolInfo(callback) {
162
- await this.init();
120
+ await this.substrateApi.isReady;
163
121
  let cancel = false;
164
122
  const updateStakingInfo = async () => {
165
- await this.substrateApi.isReady;
123
+ await this.init(true);
124
+ if (cancel) {
125
+ return;
126
+ }
166
127
  try {
167
- if (cancel) {
168
- return;
169
- }
170
- this.subnetData.forEach(subnet => {
128
+ for (const subnet of this.subnetData) {
171
129
  const netuid = subnet.netuid.toString().padStart(2, '0');
172
- const subnetSlug = `${this.slug}__subnet_${netuid.padStart(2, '0')}`;
130
+ const subnetSlug = `${this.slug}__subnet_${netuid}`;
173
131
  const subnetName = `${subnet.name || 'Unknown'} ${netuid}`;
174
132
  const bnTaoIn = new BigN(subnet.taoIn);
175
- const emission = new BigN(subnet.taoInEmission).dividedBy(new BigN(10).pow(new BigN(7)));
133
+ const emission = new BigN(subnet.taoInEmission).dividedBy(new BigN(10).pow(7));
176
134
  const data = {
177
135
  ...this.baseInfo,
178
136
  type: this.type,
@@ -185,7 +143,8 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
185
143
  subnetData: {
186
144
  netuid: subnet.netuid,
187
145
  subnetSymbol: subnet.symbol || 'dTAO'
188
- }
146
+ },
147
+ minValidate: DEFAULT_DTAO_MINBOND
189
148
  },
190
149
  statistic: {
191
150
  assetEarning: [{
@@ -206,7 +165,7 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
206
165
  }
207
166
  };
208
167
  callback(data);
209
- });
168
+ }
210
169
  } catch (error) {
211
170
  console.error('Error updating staking info:', error);
212
171
  }
@@ -224,39 +183,9 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
224
183
 
225
184
  /* Subscribe pool position */
226
185
 
227
- async parseNominatorMetadata(chainInfo, address, delegatorState) {
228
- await this.substrateApi.isReady;
229
- const nominationList = [];
230
- let allActiveStake = BN_ZERO;
231
- for (const delegate of delegatorState) {
232
- const stake = new BigN(delegate.amount);
233
- const originActiveStake = stake.multipliedBy(delegate.rate || new BigN(1)).toFixed(0).toString();
234
- const bnActiveStake = new BN(originActiveStake);
235
- if (bnActiveStake.gt(BN_ZERO)) {
236
- const delegationStatus = EarningStatus.EARNING_REWARD;
237
- allActiveStake = allActiveStake.add(bnActiveStake);
238
- nominationList.push({
239
- status: delegationStatus,
240
- chain: chainInfo.slug,
241
- validatorAddress: delegate.owner,
242
- activeStake: delegate.amount,
243
- validatorMinStake: DEFAULT_DTAO_MINBOND,
244
- originActiveStake: originActiveStake,
245
- validatorIdentity: delegate.identity
246
- });
247
- }
248
- }
249
- const stakingStatus = getEarningStatusByNominations(allActiveStake, nominationList);
250
- return {
251
- status: stakingStatus,
252
- balanceToken: this.nativeToken.slug,
253
- totalStake: allActiveStake.toString(),
254
- activeStake: allActiveStake.toString(),
255
- unstakeBalance: '0',
256
- isBondedBefore: true,
257
- nominations: nominationList,
258
- unstakings: []
259
- };
186
+ async parseNominatorMetadata(chainInfo, delegatorState, netuid) {
187
+ const bnMinBond = await this.getMinBond(netuid);
188
+ return this.parseNominatorMetadataBase(chainInfo, delegatorState, bnMinBond.toString(), true);
260
189
  }
261
190
  async subscribePoolPosition(useAddresses, rsCallback) {
262
191
  await this.init();
@@ -309,7 +238,7 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
309
238
  originalTotalStake = BN_ZERO
310
239
  } = subnetPositions[netuid] || {};
311
240
  if (delegatorState.length > 0) {
312
- this.parseNominatorMetadata(chainInfo, owner, delegatorState).then(nominatorMetadata => {
241
+ this.parseNominatorMetadata(chainInfo, delegatorState, netuid).then(nominatorMetadata => {
313
242
  rsCallback({
314
243
  ...defaultInfo,
315
244
  ...nominatorMetadata,
@@ -364,208 +293,5 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
364
293
  };
365
294
  }
366
295
 
367
- // Because not have subscan api
368
- async checkAccountHaveStake(useAddresses) {
369
- return Promise.resolve([]);
370
- }
371
-
372
296
  /* Subscribe pool position */
373
-
374
- /* Get pool targets */
375
- // eslint-disable-next-line @typescript-eslint/require-await
376
- async getDevnetPoolTargets() {
377
- const testnetDelegate = (await this.substrateApi.api.call.delegateInfoRuntimeApi.getDelegates()).toJSON();
378
- const bnMinBond = new BigN(DEFAULT_DTAO_MINBOND);
379
- const filteredDelegates = testnetDelegate.filter(delegate => {
380
- return delegate.returnPer1000 !== 0;
381
- });
382
- return filteredDelegates.map(delegate => ({
383
- address: delegate.delegateSs58,
384
- totalStake: '0',
385
- ownStake: '0',
386
- otherStake: '0',
387
- minBond: bnMinBond.toString(),
388
- nominatorCount: delegate.nominators.length,
389
- commission: delegate.take / 1000,
390
- blocked: false,
391
- isVerified: false,
392
- chain: this.chain,
393
- isCrowded: false
394
- }));
395
- }
396
- async getMainnetPoolTargets(netuid) {
397
- const _topValidator = await this.bittensorCache.get();
398
- const topValidator = _topValidator;
399
- const bnMinBond = new BigN(DEFAULT_DTAO_MINBOND);
400
- const validatorList = topValidator.data;
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;
414
- const roundedCommission = (parseFloat(commission) * 100).toFixed(0);
415
- const apr = aprMap[address];
416
- const expectedReturn = apr ? new BigN(apr).multipliedBy(100).toFixed(2) : '0';
417
- const name = validator.name || address;
418
- return {
419
- address: address,
420
- totalStake: bnTotalWeightStake.toString(),
421
- ownStake: bnRootWeightStake.toString(),
422
- otherStake: bnAlphaStake.toString(),
423
- minBond: bnMinBond.toString(),
424
- nominatorCount: nominatorCount,
425
- commission: roundedCommission,
426
- expectedReturn: expectedReturn,
427
- blocked: false,
428
- isVerified: false,
429
- chain: this.chain,
430
- isCrowded: false,
431
- identity: name
432
- };
433
- }));
434
- return results;
435
- }
436
- async getPoolTargets(netuid) {
437
- await this.init();
438
- if (this.chain === 'bittensor') {
439
- return this.getMainnetPoolTargets(netuid);
440
- } else {
441
- return this.getDevnetPoolTargets();
442
- }
443
- }
444
-
445
- /* Get pool targets */
446
-
447
- /* Join pool action */
448
-
449
- async createJoinExtrinsic(data, positionInfo, bondDest = 'Staked') {
450
- const {
451
- amount,
452
- selectedValidators: targetValidators,
453
- subnetData
454
- } = data;
455
- if (!subnetData) {
456
- throw new Error(BasicTxErrorType.INVALID_PARAMS);
457
- }
458
- const {
459
- netuid,
460
- slippage
461
- } = subnetData;
462
- const chainApi = await this.substrateApi.isReady;
463
- const binaryAmount = new BigN(amount);
464
- const alphaToTaoPrice = new BigN(await getAlphaToTaoRate(this.substrateApi, netuid));
465
- const limitPrice = alphaToTaoPrice.multipliedBy(10 ** _getAssetDecimals(this.nativeToken)).multipliedBy(1 + (slippage || DEFAULT_BITTENSOR_SLIPPAGE));
466
- const BNlimitPrice = new BigN(limitPrice.integerValue(BigN.ROUND_CEIL).toFixed());
467
-
468
- // Bittensor only supports changing 1 validator at a time, not multiple
469
- const selectedValidatorInfo = targetValidators[0];
470
- const hotkey = selectedValidatorInfo.address;
471
- const extrinsic = chainApi.api.tx.subtensorModule.addStakeLimit(hotkey, netuid, binaryAmount.toFixed(), BNlimitPrice.toFixed(), false);
472
- return [extrinsic, {
473
- slug: this.nativeToken.slug,
474
- amount: '0'
475
- }];
476
- }
477
-
478
- // Validate for case stake more
479
- async validateYieldJoin(data, path) {
480
- const baseErrors = await super.validateYieldJoin(data, path);
481
- if (baseErrors.length > 0) {
482
- return baseErrors;
483
- }
484
- const {
485
- amount
486
- } = data;
487
- if (new BigN(amount).lt(new BigN(DEFAULT_DTAO_MINBOND))) {
488
- return [new TransactionError(BasicTxErrorType.INVALID_PARAMS, t(`Insufficient stake. You need to stake at least ${formatNumber(DEFAULT_DTAO_MINBOND, _getAssetDecimals(this.nativeToken))} ${_getAssetSymbol(this.nativeToken)} to earn rewards`))];
489
- }
490
- return baseErrors;
491
- }
492
-
493
- /* Join pool action */
494
-
495
- /* Leave pool action */
496
-
497
- async handleYieldUnstake(amount, address, selectedTarget, netuid, slippage) {
498
- const apiPromise = await this.substrateApi.isReady;
499
- if (!selectedTarget) {
500
- return Promise.reject(new TransactionError(BasicTxErrorType.INVALID_PARAMS));
501
- }
502
- const binaryAmount = new BigN(amount);
503
- const alphaToTaoPrice = new BigN(await getAlphaToTaoRate(this.substrateApi, netuid || 0));
504
- const limitPrice = alphaToTaoPrice.multipliedBy(10 ** _getAssetDecimals(this.nativeToken)).multipliedBy(1 - (slippage || DEFAULT_BITTENSOR_SLIPPAGE));
505
- const BNlimitPrice = new BigN(limitPrice.integerValue(BigN.ROUND_CEIL).toFixed());
506
- const extrinsic = apiPromise.api.tx.subtensorModule.removeStakeLimit(selectedTarget, netuid, binaryAmount.toFixed(), BNlimitPrice.toFixed(), false);
507
- return [ExtrinsicType.STAKING_UNBOND, extrinsic];
508
- }
509
- async validateYieldLeave(amount, address, fastLeave, selectedTarget, slug, poolInfo) {
510
- var _poolInfo$metadata$su;
511
- const baseErrors = await super.validateYieldLeave(amount, address, fastLeave, selectedTarget, slug);
512
- if (baseErrors.length > 0) {
513
- return baseErrors;
514
- }
515
- if (!poolInfo) {
516
- return [new TransactionError(BasicTxErrorType.INVALID_PARAMS)];
517
- }
518
- const netuid = (_poolInfo$metadata$su = poolInfo.metadata.subnetData) === null || _poolInfo$metadata$su === void 0 ? void 0 : _poolInfo$metadata$su.netuid;
519
- const alphaToTaoPrice = new BigN(await getAlphaToTaoRate(this.substrateApi, netuid || 0));
520
- const minUnstake = new BigN(DEFAULT_DTAO_MINBOND).dividedBy(alphaToTaoPrice);
521
- const formattedMinUnstake = minUnstake.dividedBy(1000000).integerValue(BigN.ROUND_CEIL).dividedBy(1000);
522
- if (new BigN(amount).lt(formattedMinUnstake.multipliedBy(10 ** _getAssetDecimals(this.nativeToken)))) {
523
- var _poolInfo$metadata$su2;
524
- return [new TransactionError(BasicTxErrorType.INVALID_PARAMS, t(`Amount too low. You need to unstake at least ${formattedMinUnstake.toString()} ${((_poolInfo$metadata$su2 = poolInfo.metadata.subnetData) === null || _poolInfo$metadata$su2 === void 0 ? void 0 : _poolInfo$metadata$su2.subnetSymbol) || ''}`))];
525
- }
526
- return baseErrors;
527
- }
528
-
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
- }
571
297
  }
@@ -5,14 +5,13 @@ import { ExtrinsicType, NominationInfo, UnstakingInfo } from '@subwallet/extensi
5
5
  import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
6
6
  import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
7
7
  import { BaseYieldPositionInfo, OptimalYieldPath, PalletStakingNominations, PalletStakingStakingLedger, StakeCancelWithdrawalParams, SubmitChangeValidatorStaking, SubmitJoinNativeStaking, SubmitYieldJoinData, TransactionData, ValidatorInfo, YieldPoolInfo, YieldPoolMethodInfo, YieldPositionInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
8
- import { DeriveSessionProgress } from '@polkadot/api-derive/types';
9
8
  import { BN } from '@polkadot/util';
10
9
  import BaseNativeStakingPoolHandler from './base';
11
10
  export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPoolHandler {
12
11
  availableMethod: YieldPoolMethodInfo;
13
12
  constructor(state: KoniState, chain: string);
14
13
  subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
15
- parseNominatorMetadata(chainInfo: _ChainInfo, address: string, substrateApi: _SubstrateApi, ledger: PalletStakingStakingLedger, currentEra: string, minStake: BN, _deriveSessionProgress: DeriveSessionProgress): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
14
+ parseNominatorMetadata(chainInfo: _ChainInfo, address: string, substrateApi: _SubstrateApi, ledger: PalletStakingStakingLedger, currentEra: string, minStake: BN): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
16
15
  handleNominationsList(substrateApi: _SubstrateApi, chain: string, nominations: PalletStakingNominations, currentEra: string, address: string, maxNominatorRewardedPerValidator: number | undefined): Promise<NominationInfo[]>;
17
16
  subscribePoolPosition(useAddresses: string[], resultCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
18
17
  checkAccountHaveStake(useAddresses: string[]): Promise<string[]>;
@@ -142,7 +142,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
142
142
 
143
143
  /* Subscribe pool position */
144
144
 
145
- async parseNominatorMetadata(chainInfo, address, substrateApi, ledger, currentEra, minStake, _deriveSessionProgress) {
145
+ async parseNominatorMetadata(chainInfo, address, substrateApi, ledger, currentEra, minStake) {
146
146
  var _substrateApi$api$que7, _substrateApi$api$que8, _substrateApi$api$que9, _substrateApi$api$que10, _substrateApi$api$que11, _substrateApi$api$que12;
147
147
  const chain = chainInfo.slug;
148
148
  const [_nominations, _bonded, _activeEra] = await Promise.all([(_substrateApi$api$que7 = substrateApi.api.query) === null || _substrateApi$api$que7 === void 0 ? void 0 : (_substrateApi$api$que8 = _substrateApi$api$que7.staking) === null || _substrateApi$api$que8 === void 0 ? void 0 : _substrateApi$api$que8.nominators(address), (_substrateApi$api$que9 = substrateApi.api.query) === null || _substrateApi$api$que9 === void 0 ? void 0 : (_substrateApi$api$que10 = _substrateApi$api$que9.staking) === null || _substrateApi$api$que10 === void 0 ? void 0 : _substrateApi$api$que10.bonded(address), (_substrateApi$api$que11 = substrateApi.api.query) === null || _substrateApi$api$que11 === void 0 ? void 0 : (_substrateApi$api$que12 = _substrateApi$api$que11.staking) === null || _substrateApi$api$que12 === void 0 ? void 0 : _substrateApi$api$que12.activeEra()]);
@@ -261,7 +261,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
261
261
  }
262
262
  if (ledgers) {
263
263
  var _substrateApi$api$que14, _substrateApi$api$que15, _substrateApi$api$que16, _substrateApi$api$que17, _substrateApi$api$que18, _substrateApi$api$que19, _substrateApi$api$que20, _substrateApi$api$que21, _substrateApi$api$der, _substrateApi$api$der2;
264
- const [_currentEra, _minimumActiveStake, _minNominatorBond, _deriveSessionProgress] = await Promise.all([(_substrateApi$api$que14 = substrateApi.api.query) === null || _substrateApi$api$que14 === void 0 ? void 0 : (_substrateApi$api$que15 = _substrateApi$api$que14.staking) === null || _substrateApi$api$que15 === void 0 ? void 0 : _substrateApi$api$que15.currentEra(), ((_substrateApi$api$que16 = substrateApi.api.query) === null || _substrateApi$api$que16 === void 0 ? void 0 : (_substrateApi$api$que17 = _substrateApi$api$que16.staking) === null || _substrateApi$api$que17 === void 0 ? void 0 : _substrateApi$api$que17.minimumActiveStake) && ((_substrateApi$api$que18 = substrateApi.api.query) === null || _substrateApi$api$que18 === void 0 ? void 0 : (_substrateApi$api$que19 = _substrateApi$api$que18.staking) === null || _substrateApi$api$que19 === void 0 ? void 0 : _substrateApi$api$que19.minimumActiveStake()), (_substrateApi$api$que20 = substrateApi.api.query) === null || _substrateApi$api$que20 === void 0 ? void 0 : (_substrateApi$api$que21 = _substrateApi$api$que20.staking) === null || _substrateApi$api$que21 === void 0 ? void 0 : _substrateApi$api$que21.minNominatorBond(), (_substrateApi$api$der = substrateApi.api.derive) === null || _substrateApi$api$der === void 0 ? void 0 : (_substrateApi$api$der2 = _substrateApi$api$der.session) === null || _substrateApi$api$der2 === void 0 ? void 0 : _substrateApi$api$der2.progress()]);
264
+ const [_currentEra, _minimumActiveStake, _minNominatorBond] = await Promise.all([(_substrateApi$api$que14 = substrateApi.api.query) === null || _substrateApi$api$que14 === void 0 ? void 0 : (_substrateApi$api$que15 = _substrateApi$api$que14.staking) === null || _substrateApi$api$que15 === void 0 ? void 0 : _substrateApi$api$que15.currentEra(), ((_substrateApi$api$que16 = substrateApi.api.query) === null || _substrateApi$api$que16 === void 0 ? void 0 : (_substrateApi$api$que17 = _substrateApi$api$que16.staking) === null || _substrateApi$api$que17 === void 0 ? void 0 : _substrateApi$api$que17.minimumActiveStake) && ((_substrateApi$api$que18 = substrateApi.api.query) === null || _substrateApi$api$que18 === void 0 ? void 0 : (_substrateApi$api$que19 = _substrateApi$api$que18.staking) === null || _substrateApi$api$que19 === void 0 ? void 0 : _substrateApi$api$que19.minimumActiveStake()), (_substrateApi$api$que20 = substrateApi.api.query) === null || _substrateApi$api$que20 === void 0 ? void 0 : (_substrateApi$api$que21 = _substrateApi$api$que20.staking) === null || _substrateApi$api$que21 === void 0 ? void 0 : _substrateApi$api$que21.minNominatorBond(), (_substrateApi$api$der = substrateApi.api.derive) === null || _substrateApi$api$der === void 0 ? void 0 : (_substrateApi$api$der2 = _substrateApi$api$der.session) === null || _substrateApi$api$der2 === void 0 ? void 0 : _substrateApi$api$der2.progress()]);
265
265
  const currentEra = _currentEra.toString();
266
266
  const minActiveStake = (_minimumActiveStake === null || _minimumActiveStake === void 0 ? void 0 : _minimumActiveStake.toString()) || '0';
267
267
  const minNominatorBond = _minNominatorBond.toString();
@@ -272,7 +272,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
272
272
  const owner = reformatAddress(useAddresses[i], 42);
273
273
  const ledger = _ledger.toPrimitive();
274
274
  if (ledger) {
275
- const nominatorMetadata = await this.parseNominatorMetadata(chainInfo, owner, substrateApi, ledger, currentEra, minStake, _deriveSessionProgress);
275
+ const nominatorMetadata = await this.parseNominatorMetadata(chainInfo, owner, substrateApi, ledger, currentEra, minStake);
276
276
  resultCallback({
277
277
  ...defaultInfo,
278
278
  ...nominatorMetadata,
@@ -311,7 +311,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
311
311
  for (let i = 0; i < useAddresses.length; i++) {
312
312
  const address = useAddresses[i];
313
313
  const _ledger = ledgers[i].toPrimitive();
314
- if (_ledger.total > 0) {
314
+ if (_ledger && _ledger.total > 0) {
315
315
  result.push(address);
316
316
  }
317
317
  }
@@ -2,16 +2,26 @@ import { _ChainInfo } from '@subwallet/chain-list/types';
2
2
  import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
3
3
  import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
4
4
  import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
5
+ import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
5
6
  import BaseParaStakingPoolHandler from '@subwallet/extension-base/services/earning-service/handlers/native-staking/base-para';
6
7
  import { BaseYieldPositionInfo, OptimalYieldPath, StakeCancelWithdrawalParams, SubmitBittensorChangeValidatorStaking, SubmitJoinNativeStaking, TransactionData, UnstakingInfo, ValidatorInfo, YieldPoolInfo, YieldPoolMethodInfo, YieldPositionInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
8
+ import BigN from 'bignumber.js';
9
+ declare type Nominators = [Array<[number, number]>];
10
+ export interface TestnetBittensorDelegateInfo {
11
+ delegateSs58: string;
12
+ take: number;
13
+ nominators: Nominators;
14
+ returnPer1000: number;
15
+ }
7
16
  export interface TaoStakeInfo {
8
17
  hotkey: string;
9
18
  stake: string;
10
19
  netuid: number;
11
20
  }
12
- interface TaoStakingStakeOption {
21
+ export interface TaoStakingStakeOption {
13
22
  owner: string;
14
23
  amount: string;
24
+ rate?: BigN;
15
25
  identity?: string;
16
26
  }
17
27
  export interface RawDelegateState {
@@ -53,6 +63,13 @@ interface ValidatorApr {
53
63
  netuid: number;
54
64
  thirty_day_apy: string;
55
65
  }
66
+ export interface RateSubnetData {
67
+ netuid: number;
68
+ taoIn: string;
69
+ alphaIn: string;
70
+ alphaOut: string;
71
+ }
72
+ export declare const DEFAULT_DTAO_MINBOND = "21000000";
56
73
  export declare class BittensorCache {
57
74
  private static instance;
58
75
  private cache;
@@ -64,23 +81,26 @@ export declare class BittensorCache {
64
81
  private fetchData;
65
82
  fetchApr(netuid: number): Promise<ValidatorAprResponse>;
66
83
  }
84
+ export declare const getAlphaToTaoRate: (substrateApi: _SubstrateApi, netuid: number) => Promise<string>;
67
85
  export default class TaoNativeStakingPoolHandler extends BaseParaStakingPoolHandler {
68
86
  readonly availableMethod: YieldPoolMethodInfo;
69
- private bittensorCache;
87
+ protected bittensorCache: BittensorCache;
88
+ protected getMinBond(netuid?: number): Promise<BigN>;
70
89
  constructor(state: KoniState, chain: string);
71
90
  handleYieldWithdraw(address: string, unstakingInfo: UnstakingInfo): Promise<TransactionData>;
72
91
  handleYieldCancelUnstake(params: StakeCancelWithdrawalParams): Promise<TransactionData>;
73
92
  get maintainBalance(): string;
74
93
  subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
75
- parseNominatorMetadata(chainInfo: _ChainInfo, address: string, delegatorState: TaoStakingStakeOption[]): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
94
+ protected parseNominatorMetadataBase(chainInfo: _ChainInfo, delegatorState: TaoStakingStakeOption[], minBond: string, applyRate?: boolean): Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>;
95
+ parseNominatorMetadata(chainInfo: _ChainInfo, delegatorState: TaoStakingStakeOption[]): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
76
96
  subscribePoolPosition(useAddresses: string[], rsCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
77
97
  checkAccountHaveStake(useAddresses: string[]): Promise<string[]>;
78
98
  private getDevnetPoolTargets;
79
99
  private getMainnetPoolTargets;
80
- getPoolTargets(): Promise<ValidatorInfo[]>;
100
+ getPoolTargets(netuid?: number): Promise<ValidatorInfo[]>;
81
101
  createJoinExtrinsic(data: SubmitJoinNativeStaking, positionInfo?: YieldPositionInfo, bondDest?: string): Promise<[TransactionData, YieldTokenBaseInfo]>;
82
102
  validateYieldJoin(data: SubmitJoinNativeStaking, path: OptimalYieldPath): Promise<TransactionError[]>;
83
- handleYieldUnstake(amount: string, address: string, selectedTarget?: string): Promise<[ExtrinsicType, TransactionData]>;
103
+ handleYieldUnstake(amount: string, address: string, selectedTarget?: string, netuid?: number, slippage?: number): Promise<[ExtrinsicType, TransactionData]>;
84
104
  validateYieldLeave(amount: string, address: string, fastLeave: boolean, selectedTarget?: string, slug?: string, poolInfo?: YieldPoolInfo): Promise<TransactionError[]>;
85
105
  handleChangeEarningValidator(data: SubmitBittensorChangeValidatorStaking): Promise<TransactionData>;
86
106
  }