@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
@@ -16,13 +16,12 @@ var _utils3 = require("@subwallet/extension-base/utils");
16
16
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
17
17
  var _i18next = require("i18next");
18
18
  var _util = require("@polkadot/util");
19
- var _utils4 = require("../../utils");
20
19
  var _tao = require("./tao");
21
20
  // Copyright 2019-2022 @subwallet/extension-base
22
21
  // SPDX-License-Identifier: Apache-2.0
23
22
 
24
23
  const DEFAULT_BITTENSOR_SLIPPAGE = 0.005;
25
- const DEFAULT_DTAO_MINBOND = '600000';
24
+ const DEFAULT_DTAO_MINBOND = '21000000';
26
25
  exports.DEFAULT_DTAO_MINBOND = DEFAULT_DTAO_MINBOND;
27
26
  const getAlphaToTaoMapping = async substrateApi => {
28
27
  const allSubnets = (await substrateApi.api.call.subnetInfoRuntimeApi.getAllDynamicInfo()).toJSON();
@@ -70,7 +69,8 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
70
69
  fastUnstake: false,
71
70
  cancelUnstake: false,
72
71
  withdraw: false,
73
- claimReward: false
72
+ claimReward: false,
73
+ changeValidator: true
74
74
  };
75
75
  constructor(state, chain) {
76
76
  super(state, chain);
@@ -372,6 +372,11 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
372
372
  };
373
373
  }
374
374
 
375
+ // Because not have subscan api
376
+ async checkAccountHaveStake(useAddresses) {
377
+ return Promise.resolve([]);
378
+ }
379
+
375
380
  /* Subscribe pool position */
376
381
 
377
382
  /* Get pool targets */
@@ -396,32 +401,37 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
396
401
  isCrowded: false
397
402
  }));
398
403
  }
399
- async getMainnetPoolTargets() {
404
+ async getMainnetPoolTargets(netuid) {
400
405
  const _topValidator = await this.bittensorCache.get();
401
406
  const topValidator = _topValidator;
402
407
  const bnMinBond = new _bignumber.default(DEFAULT_DTAO_MINBOND);
403
408
  const validatorList = topValidator.data;
404
- const validatorAddresses = Object.keys(validatorList);
405
- const results = await Promise.all(validatorAddresses.map(i => {
406
- const address = validatorList[i].hotkey.ss58;
407
- const bnTotalStake = new _bignumber.default(validatorList[i].stake);
408
- const bnOwnStake = new _bignumber.default(validatorList[i].validator_stake);
409
- const otherStake = bnTotalStake.minus(bnOwnStake);
410
- const nominatorCount = validatorList[i].nominators;
411
- const commission = validatorList[i].take;
409
+ const aprResponse = await this.bittensorCache.fetchApr(netuid);
410
+ const aprMap = {};
411
+ aprResponse.data.forEach(item => {
412
+ aprMap[item.hotkey.ss58] = item.thirty_day_apy;
413
+ });
414
+ const results = await Promise.all(validatorList.map(validator => {
415
+ const address = validator.hotkey.ss58;
416
+ // With bittensor we use total weight, root weight and alpha staked insted of total stake, own stake and other stake
417
+ const bnTotalWeightStake = new _bignumber.default(validator.global_weighted_stake);
418
+ const bnRootWeightStake = new _bignumber.default(validator.weighted_root_stake);
419
+ const bnAlphaStake = new _bignumber.default(validator.global_alpha_stake_as_tao);
420
+ const nominatorCount = validator.global_nominators;
421
+ const commission = validator.take;
412
422
  const roundedCommission = (parseFloat(commission) * 100).toFixed(0);
413
- const apr = (parseFloat(validatorList[i].apr) / 10 ** 9 * 100).toFixed(2);
414
- const apyCalculate = (0, _utils4.calculateReward)(parseFloat(apr));
415
- const name = validatorList[i].name || address;
423
+ const apr = aprMap[address];
424
+ const expectedReturn = apr ? new _bignumber.default(apr).multipliedBy(100).toFixed(2) : '0';
425
+ const name = validator.name || address;
416
426
  return {
417
427
  address: address,
418
- totalStake: bnTotalStake.toString(),
419
- ownStake: bnOwnStake.toString(),
420
- otherStake: otherStake.toString(),
428
+ totalStake: bnTotalWeightStake.toString(),
429
+ ownStake: bnRootWeightStake.toString(),
430
+ otherStake: bnAlphaStake.toString(),
421
431
  minBond: bnMinBond.toString(),
422
432
  nominatorCount: nominatorCount,
423
433
  commission: roundedCommission,
424
- expectedReturn: apyCalculate.apy,
434
+ expectedReturn: expectedReturn,
425
435
  blocked: false,
426
436
  isVerified: false,
427
437
  chain: this.chain,
@@ -431,10 +441,10 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
431
441
  }));
432
442
  return results;
433
443
  }
434
- async getPoolTargets() {
444
+ async getPoolTargets(netuid) {
435
445
  await this.init();
436
446
  if (this.chain === 'bittensor') {
437
- return this.getMainnetPoolTargets();
447
+ return this.getMainnetPoolTargets(netuid);
438
448
  } else {
439
449
  return this.getDevnetPoolTargets();
440
450
  }
@@ -451,6 +461,9 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
451
461
  selectedValidators: targetValidators,
452
462
  subnetData
453
463
  } = data;
464
+ if (!subnetData) {
465
+ throw new Error(_types.BasicTxErrorType.INVALID_PARAMS);
466
+ }
454
467
  const {
455
468
  netuid,
456
469
  slippage
@@ -460,6 +473,8 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
460
473
  const alphaToTaoPrice = new _bignumber.default(await getAlphaToTaoRate(this.substrateApi, netuid));
461
474
  const limitPrice = alphaToTaoPrice.multipliedBy(10 ** (0, _utils2._getAssetDecimals)(this.nativeToken)).multipliedBy(1 + (slippage || DEFAULT_BITTENSOR_SLIPPAGE));
462
475
  const BNlimitPrice = new _bignumber.default(limitPrice.integerValue(_bignumber.default.ROUND_CEIL).toFixed());
476
+
477
+ // Bittensor only supports changing 1 validator at a time, not multiple
463
478
  const selectedValidatorInfo = targetValidators[0];
464
479
  const hotkey = selectedValidatorInfo.address;
465
480
  const extrinsic = chainApi.api.tx.subtensorModule.addStakeLimit(hotkey, netuid, binaryAmount.toFixed(), BNlimitPrice.toFixed(), false);
@@ -468,6 +483,8 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
468
483
  amount: '0'
469
484
  }];
470
485
  }
486
+
487
+ // Validate for case stake more
471
488
  async validateYieldJoin(data, path) {
472
489
  const baseErrors = await super.validateYieldJoin(data, path);
473
490
  if (baseErrors.length > 0) {
@@ -519,5 +536,46 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
519
536
  }
520
537
 
521
538
  /* Leave pool action */
539
+
540
+ /* Change validator */
541
+ async handleChangeEarningValidator(data) {
542
+ const chainApi = await this.substrateApi.isReady;
543
+ const {
544
+ amount,
545
+ maxAmount,
546
+ metadata,
547
+ originValidator,
548
+ selectedValidators: targetValidators,
549
+ subnetData
550
+ } = data;
551
+ if (!subnetData || !originValidator) {
552
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS));
553
+ }
554
+ const {
555
+ netuid
556
+ } = subnetData;
557
+ const selectedValidatorInfo = targetValidators[0];
558
+ const destValidator = selectedValidatorInfo.address;
559
+ if (new _bignumber.default(amount).lte(0)) {
560
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)('Amount must be greater than 0')));
561
+ }
562
+ if (originValidator === destValidator) {
563
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, 'From validator is the same with to validator'));
564
+ }
565
+ const alphaToTaoPrice = new _bignumber.default(await getAlphaToTaoRate(this.substrateApi, netuid || 0));
566
+ const minUnstake = new _bignumber.default(DEFAULT_DTAO_MINBOND).dividedBy(alphaToTaoPrice);
567
+ const formattedMinUnstake = minUnstake.dividedBy(1000000).integerValue(_bignumber.default.ROUND_CEIL).dividedBy(1000);
568
+ const bnMinUnstake = formattedMinUnstake.multipliedBy(10 ** (0, _utils2._getAssetDecimals)(this.nativeToken));
569
+ if (new _bignumber.default(maxAmount).lt(bnMinUnstake)) {
570
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)(`Amount too low. You need to move at least ${formattedMinUnstake.toString()} ${(metadata === null || metadata === void 0 ? void 0 : metadata.subnetSymbol) || ''}`)));
571
+ }
572
+
573
+ // Avoid remaining amount too low -> can't do anything with that amount
574
+ if (!(maxAmount === amount) && new _bignumber.default(maxAmount).minus(new _bignumber.default(amount)).lt(bnMinUnstake)) {
575
+ return Promise.reject(new _TransactionError.TransactionError(_types.StakingTxErrorType.REMAINING_AMOUNT_TOO_LOW, (0, _i18next.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 ${(0, _utils3.formatNumber)(maxAmount, (0, _utils2._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`)));
576
+ }
577
+ const extrinsic = chainApi.api.tx.subtensorModule.moveStake(originValidator, destValidator, netuid, netuid, amount);
578
+ return extrinsic;
579
+ }
522
580
  }
523
581
  exports.default = SubnetTaoStakingPoolHandler;
@@ -37,7 +37,8 @@ class MythosNativeStakingPoolHandler extends _basePara.default {
37
37
  fastUnstake: false,
38
38
  cancelUnstake: false,
39
39
  withdraw: true,
40
- claimReward: true
40
+ claimReward: true,
41
+ changeValidator: false
41
42
  };
42
43
 
43
44
  /* Subscribe pool info */
@@ -126,6 +127,34 @@ class MythosNativeStakingPoolHandler extends _basePara.default {
126
127
 
127
128
  /* Subscribe pool position */
128
129
 
130
+ async checkAccountHaveStake(useAddresses) {
131
+ var _substrateApi$api$que, _substrateApi$api$que2, _substrateApi$api$que3;
132
+ const result = [];
133
+ const substrateApi = await this.substrateApi.isReady;
134
+ 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));
135
+ const _unstakings = await Promise.all(useAddresses.map(stakerAddress => {
136
+ var _substrateApi$api$que4, _substrateApi$api$que5;
137
+ 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);
138
+ }));
139
+ if (!ledgers || !_unstakings) {
140
+ return [];
141
+ }
142
+ for (let i = 0; i < useAddresses.length; i++) {
143
+ const owner = useAddresses[i];
144
+ const _userStake = ledgers[i];
145
+ const userStake = _userStake.toPrimitive();
146
+ const _unstaking = _unstakings[i];
147
+ const unstakings = _unstaking.toPrimitive();
148
+
149
+ // TODO: Need to improve, check if can only load stake info
150
+ if (userStake && userStake.stake !== '0') {
151
+ result.push(owner);
152
+ } else if (unstakings && unstakings.some(unstake => unstake.amount !== '0')) {
153
+ result.push(owner);
154
+ }
155
+ }
156
+ return result;
157
+ }
129
158
  async subscribePoolPosition(useAddresses, resultCallback) {
130
159
  let cancel = false;
131
160
  const substrateApi = await this.substrateApi.isReady;
@@ -275,6 +275,23 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
275
275
  unsub();
276
276
  };
277
277
  }
278
+ async checkAccountHaveStake(useAddresses) {
279
+ var _substrateApi$api$que, _substrateApi$api$que2, _substrateApi$api$que3;
280
+ const result = [];
281
+ const substrateApi = await this.substrateApi.isReady;
282
+ 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));
283
+ if (!ledgers) {
284
+ return [];
285
+ }
286
+ for (let i = 0; i < useAddresses.length; i++) {
287
+ const owner = useAddresses[i];
288
+ const delegatorState = ledgers[i].toPrimitive();
289
+ if (delegatorState && delegatorState.total > 0) {
290
+ result.push(owner);
291
+ }
292
+ }
293
+ return result;
294
+ }
278
295
 
279
296
  /* Subscribe pool position */
280
297
 
@@ -22,6 +22,24 @@ var _base = _interopRequireDefault(require("./base"));
22
22
  // SPDX-License-Identifier: Apache-2.0
23
23
 
24
24
  class RelayNativeStakingPoolHandler extends _base.default {
25
+ availableMethod = {
26
+ join: true,
27
+ defaultUnstake: true,
28
+ fastUnstake: false,
29
+ cancelUnstake: true,
30
+ withdraw: true,
31
+ claimReward: false,
32
+ changeValidator: false
33
+ };
34
+ constructor(state, chain) {
35
+ super(state, chain);
36
+ if (_constants2._SUPPORT_CHANGE_VALIDATOR_CHAIN.includes(chain)) {
37
+ this.availableMethod = {
38
+ ...this.availableMethod,
39
+ changeValidator: true
40
+ };
41
+ }
42
+ }
25
43
  /* Subscribe pool info */
26
44
 
27
45
  async subscribePoolInfo(callback) {
@@ -290,6 +308,22 @@ class RelayNativeStakingPoolHandler extends _base.default {
290
308
  unsub === null || unsub === void 0 ? void 0 : unsub();
291
309
  };
292
310
  }
311
+ async checkAccountHaveStake(useAddresses) {
312
+ var _substrateApi$api$que22, _substrateApi$api$que23, _substrateApi$api$que24;
313
+ const result = [];
314
+ const substrateApi = await this.substrateApi.isReady;
315
+ const ledgers = await ((_substrateApi$api$que22 = substrateApi.api.query.staking) === null || _substrateApi$api$que22 === void 0 ? void 0 : (_substrateApi$api$que23 = _substrateApi$api$que22.ledger) === null || _substrateApi$api$que23 === void 0 ? void 0 : (_substrateApi$api$que24 = _substrateApi$api$que23.multi) === null || _substrateApi$api$que24 === void 0 ? void 0 : _substrateApi$api$que24.call(_substrateApi$api$que23, useAddresses));
316
+ if (ledgers) {
317
+ for (let i = 0; i < useAddresses.length; i++) {
318
+ const address = useAddresses[i];
319
+ const _ledger = ledgers[i].toPrimitive();
320
+ if (_ledger.total > 0) {
321
+ result.push(address);
322
+ }
323
+ }
324
+ }
325
+ return result;
326
+ }
293
327
 
294
328
  /* Subscribe pool position */
295
329
 
@@ -660,13 +694,11 @@ class RelayNativeStakingPoolHandler extends _base.default {
660
694
  const chainApi = await this.substrateApi.isReady;
661
695
  if (chainApi.api.tx.staking.withdrawUnbonded.meta.args.length === 1) {
662
696
  let slashingSpanCount;
663
- if (chainApi.api.query.staking.nominatorSlashInEra) {
664
- const currentEra = await chainApi.api.query.staking.currentEra();
665
- const slashingSpans = (await chainApi.api.query.staking.nominatorSlashInEra(currentEra.toPrimitive(), address)).toPrimitive();
666
- slashingSpanCount = slashingSpans !== null ? slashingSpans.toString() : '0';
667
- } else {
697
+ if (chainApi.api.query.staking.slashingSpans) {
668
698
  const _slashingSpans = (await chainApi.api.query.staking.slashingSpans(address)).toHuman();
669
699
  slashingSpanCount = _slashingSpans !== null ? _slashingSpans.spanIndex : '0';
700
+ } else {
701
+ slashingSpanCount = chainApi.api.consts.staking.historyDepth.toPrimitive();
670
702
  }
671
703
  return chainApi.api.tx.staking.withdrawUnbonded(slashingSpanCount);
672
704
  } else {
@@ -674,7 +706,18 @@ class RelayNativeStakingPoolHandler extends _base.default {
674
706
  return chainApi.api.tx.staking.withdrawUnbonded();
675
707
  }
676
708
  }
677
-
709
+ async handleChangeEarningValidator(data) {
710
+ const chainApi = await this.substrateApi.isReady;
711
+ const {
712
+ selectedValidators
713
+ } = data;
714
+ if (!selectedValidators || selectedValidators.length === 0) {
715
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS));
716
+ }
717
+ const validatorParamList = selectedValidators.map(validator => validator.address);
718
+ const nominateTx = chainApi.api.tx.staking.nominate(validatorParamList);
719
+ return nominateTx;
720
+ }
678
721
  /* Other actions */
679
722
  }
680
723
  exports.default = RelayNativeStakingPoolHandler;
@@ -17,8 +17,6 @@ var _utils3 = require("@subwallet/extension-base/utils");
17
17
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
18
18
  var _i18next = require("i18next");
19
19
  var _util = require("@polkadot/util");
20
- var _utils4 = require("../../utils");
21
- var _dtao = require("./dtao");
22
20
  // Copyright 2019-2022 @subwallet/extension-base
23
21
  // SPDX-License-Identifier: Apache-2.0
24
22
 
@@ -49,7 +47,7 @@ class BittensorCache {
49
47
  }
50
48
  async fetchData() {
51
49
  try {
52
- const resp = await (0, _utils3.fetchFromProxyService)(_environment.ProxyServiceRoute.BITTENSOR, '/validator/latest/v1?limit=50', {
50
+ const resp = await (0, _utils3.fetchFromProxyService)(_environment.ProxyServiceRoute.BITTENSOR, '/dtao/validator/latest/v1?limit=100', {
53
51
  method: 'GET',
54
52
  headers: {
55
53
  'Content-Type': 'application/json'
@@ -63,7 +61,7 @@ class BittensorCache {
63
61
  }
64
62
  const rawData = await resp.json();
65
63
  const data = {
66
- data: rawData.data.filter(validator => parseFloat(validator.apr) > 0.0001)
64
+ data: rawData.data.filter(validator => parseFloat(validator.root_stake) > 0)
67
65
  };
68
66
  this.cache = data;
69
67
  this.promise = null;
@@ -86,6 +84,27 @@ class BittensorCache {
86
84
  };
87
85
  }
88
86
  }
87
+ async fetchApr(netuid) {
88
+ try {
89
+ const resp = await (0, _utils3.fetchFromProxyService)(_environment.ProxyServiceRoute.BITTENSOR, `/dtao/validator/yield/latest/v1?netuid=${netuid}&limit=100&order=thirty_day_apy_desc`, {
90
+ method: 'GET',
91
+ headers: {
92
+ 'Content-Type': 'application/json'
93
+ }
94
+ });
95
+ const rawData = await resp.json();
96
+
97
+ // Some subnets not return data, ensure the structure is consistent by returning an empty array
98
+ return Array.isArray(rawData.data) ? rawData : {
99
+ data: []
100
+ };
101
+ } catch (error) {
102
+ console.error(error);
103
+ return {
104
+ data: []
105
+ };
106
+ }
107
+ }
89
108
  }
90
109
 
91
110
  // export async function fetchTaoDelegateState (address: string): Promise<RawDelegateState> {
@@ -124,7 +143,8 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
124
143
  fastUnstake: false,
125
144
  cancelUnstake: false,
126
145
  withdraw: false,
127
- claimReward: false
146
+ claimReward: false,
147
+ changeValidator: true
128
148
  };
129
149
  constructor(state, chain) {
130
150
  super(state, chain);
@@ -160,23 +180,18 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
160
180
  const minDelegatorStake = (await substrateApi.api.query.subtensorModule.nominatorMinRequiredStake()).toPrimitive() || 0;
161
181
  const maxValidatorPerNominator = (await substrateApi.api.query.subtensorModule.maxAllowedValidators(0)).toPrimitive();
162
182
  const taoIn = (await substrateApi.api.query.subtensorModule.subnetTAO(0)).toPrimitive();
163
- const _topValidator = await this.bittensorCache.get();
183
+ const _topValidator = await this.bittensorCache.fetchApr(0);
164
184
  const validators = _topValidator.data;
165
- let highestApr = validators[0];
166
- for (let i = 1; i < validators.length; i++) {
167
- if (parseFloat(validators[i].apr) > parseFloat(highestApr.apr)) {
168
- highestApr = validators[i];
169
- }
170
- }
185
+ const highestApr = validators[0];
171
186
  const bnTaoIn = new _bignumber.default(taoIn);
172
187
  const BNminDelegatorStake = new _bignumber.default(minDelegatorStake.toString());
173
- const apr = this.chain === 'bittensor' ? Number(highestApr.apr) * 100 : 0;
188
+ const apr = this.chain === 'bittensor' ? Number(highestApr.thirty_day_apy) * 100 : 0;
174
189
  const data = {
175
190
  ...this.baseInfo,
176
191
  type: this.type,
177
192
  metadata: {
178
193
  ...this.metadataInfo,
179
- description: this.getDescription()
194
+ description: this.getDescription((0, _utils3.formatNumber)(BNminDelegatorStake, (0, _utils2._getAssetDecimals)(this.nativeToken)))
180
195
  },
181
196
  statistic: {
182
197
  assetEarning: [{
@@ -387,6 +402,11 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
387
402
  };
388
403
  }
389
404
 
405
+ // Because not have subscan api
406
+ async checkAccountHaveStake(useAddresses) {
407
+ return Promise.resolve([]);
408
+ }
409
+
390
410
  /* Subscribe pool position */
391
411
 
392
412
  /* Get pool targets */
@@ -418,27 +438,32 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
418
438
  const nominatorMinRequiredStake = (await getNominatorMinRequiredStake).toString();
419
439
  const bnMinBond = new _bignumber.default(nominatorMinRequiredStake);
420
440
  const validatorList = topValidator.data;
421
- const validatorAddresses = Object.keys(validatorList);
422
- const results = await Promise.all(validatorAddresses.map(i => {
423
- const address = validatorList[i].hotkey.ss58;
424
- const bnTotalStake = new _bignumber.default(validatorList[i].stake);
425
- const bnOwnStake = new _bignumber.default(validatorList[i].validator_stake);
426
- const otherStake = bnTotalStake.minus(bnOwnStake);
427
- const nominatorCount = validatorList[i].nominators;
428
- const commission = validatorList[i].take;
441
+ const aprResponse = await this.bittensorCache.fetchApr(0);
442
+ const aprMap = {};
443
+ aprResponse.data.forEach(item => {
444
+ aprMap[item.hotkey.ss58] = item.thirty_day_apy;
445
+ });
446
+ const results = await Promise.all(validatorList.map(validator => {
447
+ const address = validator.hotkey.ss58;
448
+ // With bittensor we use total weight, root weight and alpha staked insted of total stake, own stake and other stake
449
+ const bnTotalWeightStake = new _bignumber.default(validator.global_weighted_stake);
450
+ const bnRootWeightStake = new _bignumber.default(validator.weighted_root_stake);
451
+ const bnAlphaStake = new _bignumber.default(validator.global_alpha_stake_as_tao);
452
+ const nominatorCount = validator.global_nominators;
453
+ const commission = validator.take;
429
454
  const roundedCommission = (parseFloat(commission) * 100).toFixed(0);
430
- const apr = (parseFloat(validatorList[i].apr) / 10 ** 9 * 100).toFixed(2);
431
- const apyCalculate = (0, _utils4.calculateReward)(parseFloat(apr));
432
- const name = validatorList[i].name || address;
455
+ const apr = aprMap[address];
456
+ const expectedReturn = apr ? new _bignumber.default(apr).multipliedBy(100).toFixed(2) : '0';
457
+ const name = validator.name || address;
433
458
  return {
434
459
  address: address,
435
- totalStake: bnTotalStake.toString(),
436
- ownStake: bnOwnStake.toString(),
437
- otherStake: otherStake.toString(),
460
+ totalStake: bnTotalWeightStake.toString(),
461
+ ownStake: bnRootWeightStake.toString(),
462
+ otherStake: bnAlphaStake.toString(),
438
463
  minBond: bnMinBond.toString(),
439
464
  nominatorCount: nominatorCount,
440
465
  commission: roundedCommission,
441
- expectedReturn: apyCalculate.apy,
466
+ expectedReturn: expectedReturn,
442
467
  blocked: false,
443
468
  isVerified: false,
444
469
  chain: this.chain,
@@ -476,6 +501,8 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
476
501
  amount: '0'
477
502
  }];
478
503
  }
504
+
505
+ // Validate for case stake more
479
506
  async validateYieldJoin(data, path) {
480
507
  const baseErrors = await super.validateYieldJoin(data, path);
481
508
  if (baseErrors.length > 0) {
@@ -484,8 +511,10 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
484
511
  const {
485
512
  amount
486
513
  } = data;
487
- if (new _bignumber.default(amount).lt(new _bignumber.default(_dtao.DEFAULT_DTAO_MINBOND))) {
488
- return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)(`Insufficient stake. You need to stake at least ${(0, _utils3.formatNumber)(_dtao.DEFAULT_DTAO_MINBOND, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${(0, _utils2._getAssetSymbol)(this.nativeToken)} to earn rewards`))];
514
+ const minDelegatorStake = (await this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake()).toPrimitive() || 0;
515
+ const bnMinStake = minDelegatorStake.toString();
516
+ if (new _bignumber.default(amount).lt(bnMinStake)) {
517
+ return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)(`Insufficient stake. You need to stake at least ${(0, _utils3.formatNumber)(bnMinStake, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${(0, _utils2._getAssetSymbol)(this.nativeToken)} to earn rewards`))];
489
518
  }
490
519
  return baseErrors;
491
520
  }
@@ -512,7 +541,8 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
512
541
  if (!poolInfo) {
513
542
  return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS)];
514
543
  }
515
- const bnMinUnstake = new _bignumber.default(_dtao.DEFAULT_DTAO_MINBOND);
544
+ const minDelegatorStake = (await this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake()).toPrimitive() || 0;
545
+ const bnMinUnstake = new _bignumber.default(minDelegatorStake.toString());
516
546
  if (new _bignumber.default(amount).lt(bnMinUnstake)) {
517
547
  return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)(`Amount too low. You need to unstake at least ${(0, _utils3.formatNumber)(bnMinUnstake, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${(0, _utils2._getAssetSymbol)(this.nativeToken)}`))];
518
548
  }
@@ -520,5 +550,41 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
520
550
  }
521
551
 
522
552
  /* Leave pool action */
553
+
554
+ /* Change validator */
555
+ async handleChangeEarningValidator(data) {
556
+ const chainApi = await this.substrateApi.isReady;
557
+ const {
558
+ amount,
559
+ maxAmount,
560
+ originValidator,
561
+ selectedValidators: targetValidators
562
+ } = data;
563
+ if (!originValidator) {
564
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS));
565
+ }
566
+
567
+ // Bittensor only supports changing 1 validator at a time, not multiple
568
+ const selectedValidatorInfo = targetValidators[0];
569
+ const destValidator = selectedValidatorInfo.address;
570
+ if (new _bignumber.default(amount).lte(0)) {
571
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)('Amount must be greater than 0')));
572
+ }
573
+ if (originValidator === destValidator) {
574
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, 'From validator is the same with to validator'));
575
+ }
576
+ const minDelegatorStake = (await this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake()).toPrimitive() || 0;
577
+ const bnMinMoveStake = new _bignumber.default(minDelegatorStake.toString());
578
+ if (new _bignumber.default(maxAmount).lt(bnMinMoveStake)) {
579
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)(`Amount too low. You need to move at least ${(0, _utils3.formatNumber)(bnMinMoveStake, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${(0, _utils2._getAssetSymbol)(this.nativeToken)}`)));
580
+ }
581
+
582
+ // Avoid remaining amount too low -> can't do anything with that amount
583
+ if (!(maxAmount === amount) && new _bignumber.default(maxAmount).minus(new _bignumber.default(amount)).lt(bnMinMoveStake)) {
584
+ return Promise.reject(new _TransactionError.TransactionError(_types.StakingTxErrorType.REMAINING_AMOUNT_TOO_LOW, (0, _i18next.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 ${(0, _utils3.formatNumber)(maxAmount, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${(0, _utils2._getAssetSymbol)(this.nativeToken)} to the new validator, or "Cancel" and lower the amount, then try again`)));
585
+ }
586
+ const extrinsic = chainApi.api.tx.subtensorModule.moveStake(originValidator, destValidator, 0, 0, amount);
587
+ return extrinsic;
588
+ }
523
589
  }
524
590
  exports.default = TaoNativeStakingPoolHandler;
@@ -27,7 +27,8 @@ class NominationPoolHandler extends _base.default {
27
27
  fastUnstake: false,
28
28
  cancelUnstake: false,
29
29
  withdraw: true,
30
- claimReward: true
30
+ claimReward: true,
31
+ changeValidator: false
31
32
  };
32
33
  static generateSlug(symbol, chain) {
33
34
  return `${symbol}___nomination_pool___${chain}`;
@@ -584,7 +585,9 @@ class NominationPoolHandler extends _base.default {
584
585
  });
585
586
  }
586
587
  }
587
-
588
+ handleChangeEarningValidator(data) {
589
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED));
590
+ }
588
591
  /* Other actions */
589
592
  }
590
593
  exports.default = NominationPoolHandler;
@@ -519,7 +519,9 @@ class BaseSpecialStakingPoolHandler extends _base.default {
519
519
  handleYieldWithdraw(address, unstakingInfo) {
520
520
  return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED));
521
521
  }
522
-
522
+ handleChangeEarningValidator(data) {
523
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED));
524
+ }
523
525
  /* Other actions */
524
526
  }
525
527
  exports.default = BaseSpecialStakingPoolHandler;