@subwallet/extension-base 1.3.47-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 (75) 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/background/handlers/Extension.js +21 -1
  9. package/cjs/packageInfo.js +1 -1
  10. package/cjs/services/chain-service/index.js +7 -2
  11. package/cjs/services/earning-service/constants/chains.js +4 -2
  12. package/cjs/services/earning-service/handlers/lending/interlay.js +2 -1
  13. package/cjs/services/earning-service/handlers/liquid-staking/acala.js +2 -1
  14. package/cjs/services/earning-service/handlers/liquid-staking/bifrost.js +2 -1
  15. package/cjs/services/earning-service/handlers/liquid-staking/parallel.js +2 -1
  16. package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +2 -1
  17. package/cjs/services/earning-service/handlers/native-staking/astar.js +2 -1
  18. package/cjs/services/earning-service/handlers/native-staking/base.js +5 -1
  19. package/cjs/services/earning-service/handlers/native-staking/dtao.js +74 -21
  20. package/cjs/services/earning-service/handlers/native-staking/mythos.js +2 -1
  21. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +33 -6
  22. package/cjs/services/earning-service/handlers/native-staking/tao.js +93 -32
  23. package/cjs/services/earning-service/handlers/nomination-pool/index.js +5 -2
  24. package/cjs/services/earning-service/handlers/special.js +3 -1
  25. package/cjs/services/earning-service/service.js +26 -2
  26. package/cjs/services/transaction-service/helpers/index.js +2 -0
  27. package/cjs/services/transaction-service/index.js +15 -0
  28. package/cjs/types/transaction/error.js +1 -0
  29. package/cjs/utils/account/transform.js +3 -2
  30. package/core/logic-validation/transfer.js +7 -0
  31. package/koni/api/nft/config.d.ts +1 -1
  32. package/koni/api/nft/config.js +1 -1
  33. package/koni/background/handlers/Extension.d.ts +1 -0
  34. package/koni/background/handlers/Extension.js +21 -1
  35. package/package.json +7 -7
  36. package/packageInfo.js +1 -1
  37. package/services/chain-service/index.js +7 -2
  38. package/services/earning-service/constants/chains.d.ts +1 -0
  39. package/services/earning-service/constants/chains.js +2 -1
  40. package/services/earning-service/handlers/base.d.ts +5 -3
  41. package/services/earning-service/handlers/lending/interlay.d.ts +1 -1
  42. package/services/earning-service/handlers/lending/interlay.js +2 -1
  43. package/services/earning-service/handlers/liquid-staking/acala.d.ts +1 -1
  44. package/services/earning-service/handlers/liquid-staking/acala.js +2 -1
  45. package/services/earning-service/handlers/liquid-staking/bifrost.d.ts +1 -1
  46. package/services/earning-service/handlers/liquid-staking/bifrost.js +2 -1
  47. package/services/earning-service/handlers/liquid-staking/parallel.d.ts +1 -1
  48. package/services/earning-service/handlers/liquid-staking/parallel.js +2 -1
  49. package/services/earning-service/handlers/liquid-staking/stella-swap.d.ts +1 -1
  50. package/services/earning-service/handlers/liquid-staking/stella-swap.js +2 -1
  51. package/services/earning-service/handlers/native-staking/astar.d.ts +1 -1
  52. package/services/earning-service/handlers/native-staking/astar.js +2 -1
  53. package/services/earning-service/handlers/native-staking/base.d.ts +3 -2
  54. package/services/earning-service/handlers/native-staking/base.js +5 -1
  55. package/services/earning-service/handlers/native-staking/dtao.d.ts +4 -3
  56. package/services/earning-service/handlers/native-staking/dtao.js +75 -22
  57. package/services/earning-service/handlers/native-staking/mythos.d.ts +1 -1
  58. package/services/earning-service/handlers/native-staking/mythos.js +2 -1
  59. package/services/earning-service/handlers/native-staking/relay-chain.d.ts +5 -1
  60. package/services/earning-service/handlers/native-staking/relay-chain.js +34 -7
  61. package/services/earning-service/handlers/native-staking/tao.d.ts +22 -4
  62. package/services/earning-service/handlers/native-staking/tao.js +94 -33
  63. package/services/earning-service/handlers/nomination-pool/index.d.ts +3 -2
  64. package/services/earning-service/handlers/nomination-pool/index.js +5 -2
  65. package/services/earning-service/handlers/special.d.ts +2 -1
  66. package/services/earning-service/handlers/special.js +3 -1
  67. package/services/earning-service/service.d.ts +2 -1
  68. package/services/earning-service/service.js +26 -2
  69. package/services/transaction-service/helpers/index.js +2 -0
  70. package/services/transaction-service/index.js +15 -0
  71. package/types/transaction/error.d.ts +2 -1
  72. package/types/transaction/error.js +1 -0
  73. package/types/yield/actions/join/submit.d.ts +10 -1
  74. package/types/yield/info/chain/info.d.ts +2 -0
  75. package/utils/account/transform.js +3 -2
@@ -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: [{
@@ -423,27 +438,32 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
423
438
  const nominatorMinRequiredStake = (await getNominatorMinRequiredStake).toString();
424
439
  const bnMinBond = new _bignumber.default(nominatorMinRequiredStake);
425
440
  const validatorList = topValidator.data;
426
- const validatorAddresses = Object.keys(validatorList);
427
- const results = await Promise.all(validatorAddresses.map(i => {
428
- const address = validatorList[i].hotkey.ss58;
429
- const bnTotalStake = new _bignumber.default(validatorList[i].stake);
430
- const bnOwnStake = new _bignumber.default(validatorList[i].validator_stake);
431
- const otherStake = bnTotalStake.minus(bnOwnStake);
432
- const nominatorCount = validatorList[i].nominators;
433
- 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;
434
454
  const roundedCommission = (parseFloat(commission) * 100).toFixed(0);
435
- const apr = (parseFloat(validatorList[i].apr) / 10 ** 9 * 100).toFixed(2);
436
- const apyCalculate = (0, _utils4.calculateReward)(parseFloat(apr));
437
- 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;
438
458
  return {
439
459
  address: address,
440
- totalStake: bnTotalStake.toString(),
441
- ownStake: bnOwnStake.toString(),
442
- otherStake: otherStake.toString(),
460
+ totalStake: bnTotalWeightStake.toString(),
461
+ ownStake: bnRootWeightStake.toString(),
462
+ otherStake: bnAlphaStake.toString(),
443
463
  minBond: bnMinBond.toString(),
444
464
  nominatorCount: nominatorCount,
445
465
  commission: roundedCommission,
446
- expectedReturn: apyCalculate.apy,
466
+ expectedReturn: expectedReturn,
447
467
  blocked: false,
448
468
  isVerified: false,
449
469
  chain: this.chain,
@@ -481,6 +501,8 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
481
501
  amount: '0'
482
502
  }];
483
503
  }
504
+
505
+ // Validate for case stake more
484
506
  async validateYieldJoin(data, path) {
485
507
  const baseErrors = await super.validateYieldJoin(data, path);
486
508
  if (baseErrors.length > 0) {
@@ -489,8 +511,10 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
489
511
  const {
490
512
  amount
491
513
  } = data;
492
- if (new _bignumber.default(amount).lt(new _bignumber.default(_dtao.DEFAULT_DTAO_MINBOND))) {
493
- 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`))];
494
518
  }
495
519
  return baseErrors;
496
520
  }
@@ -517,7 +541,8 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
517
541
  if (!poolInfo) {
518
542
  return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS)];
519
543
  }
520
- 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());
521
546
  if (new _bignumber.default(amount).lt(bnMinUnstake)) {
522
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)}`))];
523
548
  }
@@ -525,5 +550,41 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
525
550
  }
526
551
 
527
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
+ }
528
589
  }
529
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;
@@ -384,7 +384,13 @@ class EarningService {
384
384
  delete onlineData[inactiveSlug];
385
385
  }
386
386
  Object.values(onlineData).forEach(item => {
387
- this.updateYieldPoolInfo(item);
387
+ const handler = this.getPoolHandler(item.slug);
388
+ if (!handler) {
389
+ return;
390
+ }
391
+ const updatedItem = structuredClone(item);
392
+ updatedItem.metadata.availableMethod = handler.availableMethod;
393
+ this.updateYieldPoolInfo(updatedItem);
388
394
  });
389
395
  return onlineData;
390
396
  }
@@ -724,7 +730,13 @@ class EarningService {
724
730
  const handler = this.getPoolHandler(slug);
725
731
  if (!targets.length && handler) {
726
732
  await this.eventService.waitChainReady;
727
- targets = await handler.getPoolTargets();
733
+ const isSubnet = slug.match(/subnet_(\d+)/);
734
+ if (isSubnet) {
735
+ const subnet = Number(isSubnet[1]);
736
+ targets = await handler.getPoolTargets(subnet);
737
+ } else {
738
+ targets = await handler.getPoolTargets();
739
+ }
728
740
  }
729
741
  return targets;
730
742
  }
@@ -867,6 +879,18 @@ class EarningService {
867
879
  return Promise.reject(new _TransactionError.TransactionError(_types2.BasicTxErrorType.INTERNAL_ERROR));
868
880
  }
869
881
  }
882
+ async handleYieldChangeValidator(params) {
883
+ await this.eventService.waitChainReady;
884
+ const {
885
+ slug
886
+ } = params;
887
+ const handler = this.getPoolHandler(slug);
888
+ if (handler) {
889
+ return handler.handleChangeEarningValidator(params);
890
+ } else {
891
+ return Promise.reject(new _TransactionError.TransactionError(_types2.BasicTxErrorType.INTERNAL_ERROR));
892
+ }
893
+ }
870
894
 
871
895
  /* Other */
872
896
 
@@ -73,6 +73,8 @@ const typeName = type => {
73
73
  return 'Withdraw pool';
74
74
  case _KoniTypes.ExtrinsicType.JOIN_YIELD_POOL:
75
75
  return 'Start earning';
76
+ case _KoniTypes.ExtrinsicType.CHANGE_EARNING_VALIDATOR:
77
+ return 'Change validator';
76
78
  case _KoniTypes.ExtrinsicType.UNKNOWN:
77
79
  default:
78
80
  return 'unknown';
@@ -916,6 +916,21 @@ class TransactionService {
916
916
  };
917
917
  break;
918
918
  }
919
+ case _KoniTypes.ExtrinsicType.CHANGE_EARNING_VALIDATOR:
920
+ {
921
+ var _data$metadata;
922
+ const data = (0, _utils3.parseTransactionData)(transaction.data);
923
+ historyItem.additionalInfo = {
924
+ symbol: ((_data$metadata = data.metadata) === null || _data$metadata === void 0 ? void 0 : _data$metadata.subnetSymbol) || ''
925
+ };
926
+ if (data.amount !== '0') {
927
+ historyItem.amount = {
928
+ ...baseNativeAmount,
929
+ value: data.amount
930
+ };
931
+ }
932
+ break;
933
+ }
919
934
  case _KoniTypes.ExtrinsicType.EVM_EXECUTE:
920
935
  {
921
936
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
@@ -41,6 +41,7 @@ exports.StakingTxErrorType = StakingTxErrorType;
41
41
  StakingTxErrorType["INACTIVE_NOMINATION_POOL"] = "INACTIVE_NOMINATION_POOL";
42
42
  StakingTxErrorType["CAN_NOT_GET_METADATA"] = "CAN_NOT_GET_METADATA";
43
43
  StakingTxErrorType["NOT_ENOUGH_MIN_UNSTAKE"] = "NOT_ENOUGH_MIN_UNSTAKE";
44
+ StakingTxErrorType["REMAINING_AMOUNT_TOO_LOW"] = "REMAINING_AMOUNT_TOO_LOW";
44
45
  })(StakingTxErrorType || (exports.StakingTxErrorType = StakingTxErrorType = {}));
45
46
  let TransferTxErrorType;
46
47
  exports.TransferTxErrorType = TransferTxErrorType;
@@ -154,7 +154,7 @@ const BASE_TRANSFER_ACTIONS = [_KoniTypes.ExtrinsicType.TRANSFER_BALANCE, _KoniT
154
154
  const NATIVE_STAKE_ACTIONS = [_KoniTypes.ExtrinsicType.STAKING_BOND, _KoniTypes.ExtrinsicType.STAKING_UNBOND, _KoniTypes.ExtrinsicType.STAKING_WITHDRAW,
155
155
  // ExtrinsicType.STAKING_COMPOUNDING,
156
156
  // ExtrinsicType.STAKING_CANCEL_COMPOUNDING,
157
- _KoniTypes.ExtrinsicType.STAKING_CANCEL_UNSTAKE];
157
+ _KoniTypes.ExtrinsicType.STAKING_CANCEL_UNSTAKE, _KoniTypes.ExtrinsicType.CHANGE_EARNING_VALIDATOR];
158
158
  const POOL_STAKE_ACTIONS = [_KoniTypes.ExtrinsicType.STAKING_JOIN_POOL, _KoniTypes.ExtrinsicType.STAKING_LEAVE_POOL, _KoniTypes.ExtrinsicType.STAKING_POOL_WITHDRAW, _KoniTypes.ExtrinsicType.STAKING_CLAIM_REWARD, _KoniTypes.ExtrinsicType.JOIN_YIELD_POOL];
159
159
  const EARN_VDOT_ACTIONS = [_KoniTypes.ExtrinsicType.MINT_VDOT, _KoniTypes.ExtrinsicType.REDEEM_VDOT, _KoniTypes.ExtrinsicType.UNSTAKE_VDOT];
160
160
  const EARN_LDOT_ACTIONS = [_KoniTypes.ExtrinsicType.MINT_LDOT, _KoniTypes.ExtrinsicType.REDEEM_LDOT, _KoniTypes.ExtrinsicType.UNSTAKE_LDOT];
@@ -402,8 +402,9 @@ const convertAccountProxyType = accountSignMode => {
402
402
  return _types2.AccountProxyType.ALL_ACCOUNT;
403
403
  case _types2.AccountSignMode.UNKNOWN:
404
404
  return _types2.AccountProxyType.UNKNOWN;
405
+ default:
406
+ return _types2.AccountProxyType.UNKNOWN;
405
407
  }
406
- return _types2.AccountProxyType.UNKNOWN;
407
408
  };
408
409
  exports.convertAccountProxyType = convertAccountProxyType;
409
410
  const _combineAccounts = (accounts, modifyPairs, accountProxies) => {
@@ -188,6 +188,13 @@ export function checkSupportForAction(validationResponse, blockedActionsMap) {
188
188
  currentAction = `${extrinsicType}___${chain}`;
189
189
  break;
190
190
  }
191
+ case ExtrinsicType.CHANGE_EARNING_VALIDATOR:
192
+ {
193
+ const data = validationResponse.data;
194
+ const slug = data.slug;
195
+ currentAction = `${extrinsicType}___${slug}`;
196
+ break;
197
+ }
191
198
  case ExtrinsicType.STAKING_CLAIM_REWARD:
192
199
  {
193
200
  const data = validationResponse.data;
@@ -32,7 +32,7 @@ export declare const IPFS_FLEEK = "https://ipfs.fleek.co/ipfs/";
32
32
  export declare const W3S_IPFS = "https://w3s.link/ipfs/";
33
33
  export declare const IPFS2_RMRK = "https://ipfs2.rmrk.link/ipfs/";
34
34
  export declare const IPFS_ETH_ARAGON = "https://ipfs.eth.aragon.network/ipfs/";
35
- export declare const SUBWALLET_IPFS = "https://ipfs.subwallet.app/ipfs/";
35
+ export declare const SUBWALLET_IPFS = "https://ipfs-files.subwallet.app/ipfs/";
36
36
  export declare enum SUPPORTED_NFT_NETWORKS {
37
37
  karura = "karura",
38
38
  acala = "acala",
@@ -62,7 +62,7 @@ export const IPFS_FLEEK = 'https://ipfs.fleek.co/ipfs/';
62
62
  export const W3S_IPFS = 'https://w3s.link/ipfs/'; // 400
63
63
  export const IPFS2_RMRK = 'https://ipfs2.rmrk.link/ipfs/'; // ????
64
64
  export const IPFS_ETH_ARAGON = 'https://ipfs.eth.aragon.network/ipfs/'; // 400
65
- export const SUBWALLET_IPFS = 'https://ipfs.subwallet.app/ipfs/'; // ???
65
+ export const SUBWALLET_IPFS = 'https://ipfs-files.subwallet.app/ipfs/'; // ???
66
66
 
67
67
  export let SUPPORTED_NFT_NETWORKS;
68
68
  (function (SUPPORTED_NFT_NETWORKS) {
@@ -253,6 +253,7 @@ export default class KoniExtension {
253
253
  private yieldSubmitCancelWithdrawal;
254
254
  private yieldSubmitClaimReward;
255
255
  private yieldGetEarningSlippage;
256
+ private handleYieldChangeValidator;
256
257
  private unlockDotCheckCanMint;
257
258
  private unlockDotSubscribeMintedData;
258
259
  private subscribeProcessingBanner;
@@ -3970,6 +3970,25 @@ export default class KoniExtension {
3970
3970
  const slippage = await this.#koniState.earningService.yieldGetEarningSlippage(params);
3971
3971
  return slippage;
3972
3972
  }
3973
+ async handleYieldChangeValidator(params) {
3974
+ const {
3975
+ address,
3976
+ slug
3977
+ } = params;
3978
+ const poolHandler = this.#koniState.earningService.getPoolHandler(slug);
3979
+ if (!poolHandler) {
3980
+ return this.#koniState.transactionService.generateBeforeHandleResponseErrors([new TransactionError(BasicTxErrorType.INVALID_PARAMS)]);
3981
+ }
3982
+ const extrinsic = await this.#koniState.earningService.handleYieldChangeValidator(params);
3983
+ return await this.#koniState.transactionService.handleTransaction({
3984
+ address,
3985
+ chain: poolHandler.chain,
3986
+ transaction: extrinsic,
3987
+ data: params,
3988
+ extrinsicType: ExtrinsicType.CHANGE_EARNING_VALIDATOR,
3989
+ chainType: ChainType.SUBSTRATE
3990
+ });
3991
+ }
3973
3992
 
3974
3993
  /* Campaign */
3975
3994
 
@@ -4839,7 +4858,8 @@ export default class KoniExtension {
4839
4858
  return await this.yieldSubmitClaimReward(request);
4840
4859
  case 'pri(yield.getEarningSlippage)':
4841
4860
  return await this.yieldGetEarningSlippage(request);
4842
-
4861
+ case 'pri(yield.changeValidator.submit)':
4862
+ return await this.handleYieldChangeValidator(request);
4843
4863
  /* Others */
4844
4864
 
4845
4865
  /* Actions */
package/package.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "./cjs/detectPackage.js"
18
18
  ],
19
19
  "type": "module",
20
- "version": "1.3.47-0",
20
+ "version": "1.3.48-0",
21
21
  "main": "./cjs/index.js",
22
22
  "module": "./index.js",
23
23
  "types": "./index.d.ts",
@@ -2865,13 +2865,13 @@
2865
2865
  "@reduxjs/toolkit": "^1.9.1",
2866
2866
  "@sora-substrate/type-definitions": "^1.17.7",
2867
2867
  "@substrate/connect": "^0.8.9",
2868
- "@subwallet/chain-list": "0.2.109",
2869
- "@subwallet/extension-base": "^1.3.47-0",
2870
- "@subwallet/extension-chains": "^1.3.47-0",
2871
- "@subwallet/extension-dapp": "^1.3.47-0",
2872
- "@subwallet/extension-inject": "^1.3.47-0",
2868
+ "@subwallet/chain-list": "0.2.108-beta.15",
2869
+ "@subwallet/extension-base": "^1.3.48-0",
2870
+ "@subwallet/extension-chains": "^1.3.48-0",
2871
+ "@subwallet/extension-dapp": "^1.3.48-0",
2872
+ "@subwallet/extension-inject": "^1.3.48-0",
2873
2873
  "@subwallet/keyring": "^0.1.12",
2874
- "@subwallet/subwallet-api-sdk": "^1.3.47-0",
2874
+ "@subwallet/subwallet-api-sdk": "^1.3.48-0",
2875
2875
  "@subwallet/ui-keyring": "^0.1.12",
2876
2876
  "@ton/core": "^0.56.3",
2877
2877
  "@ton/crypto": "^3.2.0",
package/packageInfo.js CHANGED
@@ -7,5 +7,5 @@ export const packageInfo = {
7
7
  name: '@subwallet/extension-base',
8
8
  path: (import.meta && import.meta.url) ? new URL(import.meta.url).pathname.substring(0, new URL(import.meta.url).pathname.lastIndexOf('/') + 1) : 'auto',
9
9
  type: 'esm',
10
- version: '1.3.47-0'
10
+ version: '1.3.48-0'
11
11
  };
@@ -667,15 +667,20 @@ export class ChainService {
667
667
  const priorityTokensMap = this.priorityTokensSubject.value || {};
668
668
  const priorityTokensList = priorityTokensMap.token && typeof priorityTokensMap.token === 'object' ? Object.keys(priorityTokensMap.token) : [];
669
669
  for (const assetSlug of priorityTokensList) {
670
- const assetState = assetSettings[assetSlug];
671
670
  const assetInfo = this.getAssetBySlug(assetSlug);
671
+
672
+ // This can occur if the assetSlug is not present in the current chainlist version
673
+ if (!assetInfo) {
674
+ continue;
675
+ }
676
+ const assetState = assetSettings[assetSlug];
672
677
  const chainState = chainStateMap[assetInfo.originChain];
673
678
  if (!assetState) {
674
679
  // If this asset not has asset setting, this token is not enabled before (not turned off before)
675
680
  if (!chainState || !chainState.manualTurnOff) {
676
681
  await this.updateAssetSetting(assetSlug, {
677
682
  visible: true
678
- }, true);
683
+ }, false);
679
684
  }
680
685
  }
681
686
  }
@@ -22,3 +22,4 @@ export declare const ST_LIQUID_TOKEN_ABI: Record<string, any>;
22
22
  export declare const MANTA_VALIDATOR_POINTS_PER_BLOCK = 20;
23
23
  export declare const MANTA_MIN_DELEGATION = 500;
24
24
  export declare const CHANNEL_ID = 7;
25
+ export declare const _SUPPORT_CHANGE_VALIDATOR_CHAIN: string[];
@@ -28,4 +28,5 @@ export const MaxEraRewardPointsEras = 14;
28
28
  export const ST_LIQUID_TOKEN_ABI = require("./abis/st_liquid_token_abi.json");
29
29
  export const MANTA_VALIDATOR_POINTS_PER_BLOCK = 20;
30
30
  export const MANTA_MIN_DELEGATION = 500;
31
- export const CHANNEL_ID = 7;
31
+ export const CHANNEL_ID = 7;
32
+ export const _SUPPORT_CHANGE_VALIDATOR_CHAIN = ['polkadot', 'kusama'];
@@ -3,7 +3,7 @@ import { TransactionError } from '@subwallet/extension-base/background/errors/Tr
3
3
  import { ChainType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
4
4
  import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
5
5
  import { _EvmApi, _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
6
- import { BasePoolInfo, BaseYieldPoolMetadata, EarningRewardHistoryItem, EarningRewardItem, HandleYieldStepData, OptimalYieldPath, OptimalYieldPathParams, RequestEarlyValidateYield, RequestEarningSlippage, ResponseEarlyValidateYield, StakeCancelWithdrawalParams, SubmitYieldJoinData, TransactionData, UnstakingInfo, YieldPoolInfo, YieldPoolMethodInfo, YieldPoolTarget, YieldPoolType, YieldPositionInfo, YieldStepBaseInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
6
+ import { BasePoolInfo, BaseYieldPoolMetadata, EarningRewardHistoryItem, EarningRewardItem, HandleYieldStepData, OptimalYieldPath, OptimalYieldPathParams, RequestEarlyValidateYield, RequestEarningSlippage, ResponseEarlyValidateYield, StakeCancelWithdrawalParams, SubmitChangeValidatorStaking, SubmitYieldJoinData, TransactionData, UnstakingInfo, YieldPoolInfo, YieldPoolMethodInfo, YieldPoolTarget, YieldPoolType, YieldPositionInfo, YieldStepBaseInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
7
7
  import { EarningSlippageResult } from './native-staking/dtao';
8
8
  /**
9
9
  * @class BasePoolHandler
@@ -27,7 +27,7 @@ export default abstract class BasePoolHandler {
27
27
  /** Pool's transaction type */
28
28
  readonly transactionChainType: ChainType;
29
29
  /** Pool's available method */
30
- protected abstract readonly availableMethod: YieldPoolMethodInfo;
30
+ abstract readonly availableMethod: YieldPoolMethodInfo;
31
31
  /**
32
32
  * @constructor
33
33
  * @param {KoniState} state - Koni state
@@ -61,7 +61,7 @@ export default abstract class BasePoolHandler {
61
61
  /** Get pool reward history */
62
62
  abstract getPoolRewardHistory(useAddresses: string[], callback: (rs: EarningRewardHistoryItem) => void): Promise<VoidFunction>;
63
63
  /** Get pool target */
64
- abstract getPoolTargets(): Promise<YieldPoolTarget[]>;
64
+ abstract getPoolTargets(netuid?: number): Promise<YieldPoolTarget[]>;
65
65
  earlyValidate(request: RequestEarlyValidateYield): Promise<ResponseEarlyValidateYield>;
66
66
  /**
67
67
  * @function firstStepFee
@@ -113,6 +113,8 @@ export default abstract class BasePoolHandler {
113
113
  abstract handleYieldCancelUnstake(params: StakeCancelWithdrawalParams): Promise<TransactionData>;
114
114
  /** Create `transaction` to claim reward */
115
115
  abstract handleYieldClaimReward(address: string, bondReward?: boolean): Promise<TransactionData>;
116
+ /** Change earning validator */
117
+ abstract handleChangeEarningValidator(data: SubmitChangeValidatorStaking): Promise<TransactionData>;
116
118
  /** Check handler can handle slug */
117
119
  canHandleSlug(slug: string): boolean;
118
120
  getEarningSlippage(params: RequestEarningSlippage): Promise<EarningSlippageResult>;
@@ -11,7 +11,7 @@ export default class InterlayLendingPoolHandler extends BaseLendingPoolHandler {
11
11
  protected readonly inputAsset: string;
12
12
  protected readonly rewardAssets: string[];
13
13
  protected readonly feeAssets: string[];
14
- protected readonly availableMethod: YieldPoolMethodInfo;
14
+ readonly availableMethod: YieldPoolMethodInfo;
15
15
  protected readonly rateDecimals = 18;
16
16
  constructor(state: KoniState, chain: string);
17
17
  protected getDescription(): string;
@@ -20,7 +20,8 @@ export default class InterlayLendingPoolHandler extends BaseLendingPoolHandler {
20
20
  fastUnstake: true,
21
21
  cancelUnstake: false,
22
22
  withdraw: false,
23
- claimReward: false
23
+ claimReward: false,
24
+ changeValidator: false
24
25
  };
25
26
  rateDecimals = 18;
26
27
  constructor(state, chain) {
@@ -12,7 +12,7 @@ export default class AcalaLiquidStakingPoolHandler extends BaseLiquidStakingPool
12
12
  protected readonly feeAssets: string[];
13
13
  readonly minAmountPercent = 0.98;
14
14
  protected readonly rateDecimals = 10;
15
- protected readonly availableMethod: YieldPoolMethodInfo;
15
+ readonly availableMethod: YieldPoolMethodInfo;
16
16
  slug: string;
17
17
  constructor(state: KoniState, chain: string);
18
18
  protected getDescription(): string;
@@ -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);