@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
@@ -16,7 +16,7 @@ import { AuthUrls } from '@subwallet/extension-base/services/request-service/typ
16
16
  import { CrowdloanContributionsResponse } from '@subwallet/extension-base/services/subscan-service/types';
17
17
  import { BitcoinTransactionData, SWTransactionResponse, SWTransactionResult } from '@subwallet/extension-base/services/transaction-service/types';
18
18
  import { WalletConnectNotSupportRequest, WalletConnectSessionRequest } from '@subwallet/extension-base/services/wallet-connect-service/types';
19
- import { AccountChainType, AccountJson, AccountsWithCurrentAddress, AddressJson, BalanceJson, BaseRequestSign, BuyServiceInfo, BuyTokenInfo, CommonOptimalTransferPath, CurrentAccountInfo, EarningRewardHistoryItem, EarningRewardJson, EarningStatus, HandleYieldStepParams, InternalRequestSign, LeavePoolAdditionalData, NominationPoolInfo, OptimalYieldPath, OptimalYieldPathParams, RequestAccountBatchExportV2, RequestAccountCreateSuriV2, RequestAccountNameValidate, RequestAccountProxyEdit, RequestAccountProxyForget, RequestBatchJsonGetAccountInfo, RequestBatchRestoreV2, RequestBounceableValidate, RequestChangeAllowOneSign, RequestChangeTonWalletContractVersion, RequestCheckCrossChainTransfer, RequestCheckPublicAndSecretKey, RequestCheckTransfer, RequestCrossChainTransfer, RequestDeriveCreateMultiple, RequestDeriveCreateV3, RequestDeriveValidateV2, RequestEarlyValidateYield, RequestEarningSlippage, RequestExportAccountProxyMnemonic, RequestGetAllTonWalletContractVersion, RequestGetAmountForPair, RequestGetDeriveAccounts, RequestGetDeriveSuggestion, RequestGetTokensCanPayFee, RequestGetYieldPoolTargets, RequestInputAccountSubscribe, RequestJsonGetAccountInfo, RequestJsonRestoreV2, RequestMetadataHash, RequestMnemonicCreateV2, RequestMnemonicValidateV2, RequestPrivateKeyValidateV2, RequestShortenMetadata, RequestStakeCancelWithdrawal, RequestStakeClaimReward, RequestSubmitProcessTransaction, RequestSubscribeProcessById, RequestTransfer, RequestUnlockDotCheckCanMint, RequestUnlockDotSubscribeMintedData, RequestYieldLeave, RequestYieldStepSubmit, RequestYieldWithdrawal, ResponseAccountBatchExportV2, ResponseAccountCreateSuriV2, ResponseAccountNameValidate, ResponseBatchJsonGetAccountInfo, ResponseCheckPublicAndSecretKey, ResponseDeriveValidateV2, ResponseEarlyValidateYield, ResponseExportAccountProxyMnemonic, ResponseGetAllTonWalletContractVersion, ResponseGetDeriveAccounts, ResponseGetDeriveSuggestion, ResponseGetYieldPoolTargets, ResponseInputAccountSubscribe, ResponseJsonGetAccountInfo, ResponseMetadataHash, ResponseMnemonicCreateV2, ResponseMnemonicValidateV2, ResponsePrivateKeyValidateV2, ResponseShortenMetadata, ResponseSubscribeProcessAlive, ResponseSubscribeProcessById, StorageDataInterface, SubmitYieldStepData, SubnetYieldPositionInfo, SwapPair, SwapQuoteResponse, SwapRequest, SwapRequestResult, SwapRequestV2, SwapSubmitParams, SwapTxData, TokenSpendingApprovalParams, UnlockDotTransactionNft, UnstakingStatus, ValidateSwapProcessParams, ValidateYieldProcessParams, YieldPoolInfo, YieldPoolType, YieldPositionInfo } from '@subwallet/extension-base/types';
19
+ import { AccountChainType, AccountJson, AccountsWithCurrentAddress, AddressJson, BalanceJson, BaseRequestSign, BuyServiceInfo, BuyTokenInfo, CommonOptimalTransferPath, CurrentAccountInfo, EarningRewardHistoryItem, EarningRewardJson, EarningStatus, HandleYieldStepParams, InternalRequestSign, LeavePoolAdditionalData, NominationPoolInfo, OptimalYieldPath, OptimalYieldPathParams, RequestAccountBatchExportV2, RequestAccountCreateSuriV2, RequestAccountNameValidate, RequestAccountProxyEdit, RequestAccountProxyForget, RequestBatchJsonGetAccountInfo, RequestBatchRestoreV2, RequestBounceableValidate, RequestChangeAllowOneSign, RequestChangeTonWalletContractVersion, RequestCheckCrossChainTransfer, RequestCheckPublicAndSecretKey, RequestCheckTransfer, RequestCrossChainTransfer, RequestDeriveCreateMultiple, RequestDeriveCreateV3, RequestDeriveValidateV2, RequestEarlyValidateYield, RequestEarningSlippage, RequestExportAccountProxyMnemonic, RequestGetAllTonWalletContractVersion, RequestGetAmountForPair, RequestGetDeriveAccounts, RequestGetDeriveSuggestion, RequestGetTokensCanPayFee, RequestGetYieldPoolTargets, RequestInputAccountSubscribe, RequestJsonGetAccountInfo, RequestJsonRestoreV2, RequestMetadataHash, RequestMnemonicCreateV2, RequestMnemonicValidateV2, RequestPrivateKeyValidateV2, RequestShortenMetadata, RequestStakeCancelWithdrawal, RequestStakeClaimReward, RequestSubmitProcessTransaction, RequestSubscribeProcessById, RequestTransfer, RequestUnlockDotCheckCanMint, RequestUnlockDotSubscribeMintedData, RequestYieldLeave, RequestYieldStepSubmit, RequestYieldWithdrawal, ResponseAccountBatchExportV2, ResponseAccountCreateSuriV2, ResponseAccountNameValidate, ResponseBatchJsonGetAccountInfo, ResponseCheckPublicAndSecretKey, ResponseDeriveValidateV2, ResponseEarlyValidateYield, ResponseExportAccountProxyMnemonic, ResponseGetAllTonWalletContractVersion, ResponseGetDeriveAccounts, ResponseGetDeriveSuggestion, ResponseGetYieldPoolTargets, ResponseInputAccountSubscribe, ResponseJsonGetAccountInfo, ResponseMetadataHash, ResponseMnemonicCreateV2, ResponseMnemonicValidateV2, ResponsePrivateKeyValidateV2, ResponseShortenMetadata, ResponseSubscribeProcessAlive, ResponseSubscribeProcessById, StorageDataInterface, SubmitChangeValidatorStaking, SubmitYieldJoinData, SubmitYieldStepData, SubnetYieldPositionInfo, SwapPair, SwapQuoteResponse, SwapRequest, SwapRequestResult, SwapRequestV2, SwapSubmitParams, SwapTxData, TokenSpendingApprovalParams, UnlockDotTransactionNft, UnstakingStatus, ValidateSwapProcessParams, ValidateYieldProcessParams, YieldPoolInfo, YieldPoolType, YieldPositionInfo } from '@subwallet/extension-base/types';
20
20
  import { RequestSubmitSignPsbtTransfer, RequestSubmitTransfer, RequestSubmitTransferWithId, RequestSubscribeTransfer, ResponseSubscribeTransfer, ResponseSubscribeTransferConfirmation } from '@subwallet/extension-base/types/balance/transfer';
21
21
  import { RequestClaimBridge } from '@subwallet/extension-base/types/bridge';
22
22
  import { GetNotificationParams, RequestIsClaimedPolygonBridge, RequestSwitchStatusParams } from '@subwallet/extension-base/types/notification';
@@ -425,6 +425,7 @@ export declare enum ExtrinsicType {
425
425
  STAKING_CANCEL_COMPOUNDING = "staking.cancel_compounding",
426
426
  STAKING_CANCEL_UNSTAKE = "staking.cancel_unstake",
427
427
  JOIN_YIELD_POOL = "earn.join_pool",
428
+ CHANGE_EARNING_VALIDATOR = "earn.nominate",
428
429
  MINT_VDOT = "earn.mint_vdot",
429
430
  MINT_LDOT = "earn.mint_ldot",
430
431
  MINT_SDOT = "earn.mint_sdot",
@@ -458,6 +459,7 @@ export interface ExtrinsicDataTypeMap {
458
459
  [ExtrinsicType.STAKING_LEAVE_POOL]: RequestYieldLeave;
459
460
  [ExtrinsicType.STAKING_BOND]: RequestStakePoolingBonding;
460
461
  [ExtrinsicType.STAKING_UNBOND]: RequestUnbondingSubmit;
462
+ [ExtrinsicType.CHANGE_EARNING_VALIDATOR]: SubmitChangeValidatorStaking;
461
463
  [ExtrinsicType.STAKING_CLAIM_REWARD]: RequestStakeClaimReward;
462
464
  [ExtrinsicType.STAKING_WITHDRAW]: RequestYieldWithdrawal;
463
465
  [ExtrinsicType.STAKING_COMPOUNDING]: RequestTuringStakeCompound;
@@ -1336,6 +1338,9 @@ export interface NominationInfo {
1336
1338
  validatorMinStake?: string;
1337
1339
  status: EarningStatus;
1338
1340
  originActiveStake?: string;
1341
+ commission?: number;
1342
+ expectedReturn?: number;
1343
+ eraRewardPoint?: string;
1339
1344
  }
1340
1345
  export interface UnstakingInfo {
1341
1346
  chain: string;
@@ -1931,6 +1936,7 @@ export interface KoniRequestSignatures {
1931
1936
  'pri(yield.cancelWithdrawal.submit)': [RequestStakeCancelWithdrawal, SWTransactionResponse];
1932
1937
  'pri(yield.claimReward.submit)': [RequestStakeClaimReward, SWTransactionResponse];
1933
1938
  'pri(yield.getEarningSlippage)': [RequestEarningSlippage, EarningSlippageResult];
1939
+ 'pri(yield.changeValidator.submit)': [SubmitYieldJoinData, SWTransactionResponse];
1934
1940
  'pri(transaction.history.getSubscription)': [null, TransactionHistoryItem[], TransactionHistoryItem[]];
1935
1941
  'pri(transaction.history.subscribe)': [RequestSubscribeHistory, ResponseSubscribeHistory, TransactionHistoryItem[]];
1936
1942
  'pri(transfer.getMaxTransferable)': [RequestMaxTransferable, AmountData];
@@ -84,6 +84,7 @@ export let ExtrinsicType;
84
84
  ExtrinsicType["STAKING_CANCEL_COMPOUNDING"] = "staking.cancel_compounding";
85
85
  ExtrinsicType["STAKING_CANCEL_UNSTAKE"] = "staking.cancel_unstake";
86
86
  ExtrinsicType["JOIN_YIELD_POOL"] = "earn.join_pool";
87
+ ExtrinsicType["CHANGE_EARNING_VALIDATOR"] = "earn.nominate";
87
88
  ExtrinsicType["MINT_VDOT"] = "earn.mint_vdot";
88
89
  ExtrinsicType["MINT_LDOT"] = "earn.mint_ldot";
89
90
  ExtrinsicType["MINT_SDOT"] = "earn.mint_sdot";
@@ -87,6 +87,10 @@ const defaultErrorMap = {
87
87
  message: detectTranslate('Unable to fetch staking data. Re-enable current network and try again'),
88
88
  code: undefined
89
89
  },
90
+ [StakingTxErrorType.REMAINING_AMOUNT_TOO_LOW]: {
91
+ message: detectTranslate('Remaining amount too low'),
92
+ code: undefined
93
+ },
90
94
  [TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT]: {
91
95
  message: detectTranslate('Receiver is not enough existential deposit'),
92
96
  code: undefined
@@ -99,6 +99,7 @@ exports.ExtrinsicType = ExtrinsicType;
99
99
  ExtrinsicType["STAKING_CANCEL_COMPOUNDING"] = "staking.cancel_compounding";
100
100
  ExtrinsicType["STAKING_CANCEL_UNSTAKE"] = "staking.cancel_unstake";
101
101
  ExtrinsicType["JOIN_YIELD_POOL"] = "earn.join_pool";
102
+ ExtrinsicType["CHANGE_EARNING_VALIDATOR"] = "earn.nominate";
102
103
  ExtrinsicType["MINT_VDOT"] = "earn.mint_vdot";
103
104
  ExtrinsicType["MINT_LDOT"] = "earn.mint_ldot";
104
105
  ExtrinsicType["MINT_SDOT"] = "earn.mint_sdot";
@@ -92,6 +92,10 @@ const defaultErrorMap = {
92
92
  message: (0, _utils.detectTranslate)('Unable to fetch staking data. Re-enable current network and try again'),
93
93
  code: undefined
94
94
  },
95
+ [_types.StakingTxErrorType.REMAINING_AMOUNT_TOO_LOW]: {
96
+ message: (0, _utils.detectTranslate)('Remaining amount too low'),
97
+ code: undefined
98
+ },
95
99
  [_types.TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT]: {
96
100
  message: (0, _utils.detectTranslate)('Receiver is not enough existential deposit'),
97
101
  code: undefined
@@ -204,6 +204,13 @@ function checkSupportForAction(validationResponse, blockedActionsMap) {
204
204
  currentAction = `${extrinsicType}___${chain}`;
205
205
  break;
206
206
  }
207
+ case _KoniTypes.ExtrinsicType.CHANGE_EARNING_VALIDATOR:
208
+ {
209
+ const data = validationResponse.data;
210
+ const slug = data.slug;
211
+ currentAction = `${extrinsicType}___${slug}`;
212
+ break;
213
+ }
207
214
  case _KoniTypes.ExtrinsicType.STAKING_CLAIM_REWARD:
208
215
  {
209
216
  const data = validationResponse.data;
@@ -100,7 +100,7 @@ const IPFS2_RMRK = 'https://ipfs2.rmrk.link/ipfs/'; // ????
100
100
  exports.IPFS2_RMRK = IPFS2_RMRK;
101
101
  const IPFS_ETH_ARAGON = 'https://ipfs.eth.aragon.network/ipfs/'; // 400
102
102
  exports.IPFS_ETH_ARAGON = IPFS_ETH_ARAGON;
103
- const SUBWALLET_IPFS = 'https://ipfs.subwallet.app/ipfs/'; // ???
103
+ const SUBWALLET_IPFS = 'https://ipfs-files.subwallet.app/ipfs/'; // ???
104
104
  exports.SUBWALLET_IPFS = SUBWALLET_IPFS;
105
105
  let SUPPORTED_NFT_NETWORKS;
106
106
  exports.SUPPORTED_NFT_NETWORKS = SUPPORTED_NFT_NETWORKS;
@@ -4061,6 +4061,25 @@ class KoniExtension {
4061
4061
  const slippage = await this.#koniState.earningService.yieldGetEarningSlippage(params);
4062
4062
  return slippage;
4063
4063
  }
4064
+ async handleYieldChangeValidator(params) {
4065
+ const {
4066
+ address,
4067
+ slug
4068
+ } = params;
4069
+ const poolHandler = this.#koniState.earningService.getPoolHandler(slug);
4070
+ if (!poolHandler) {
4071
+ return this.#koniState.transactionService.generateBeforeHandleResponseErrors([new _TransactionError.TransactionError(_types4.BasicTxErrorType.INVALID_PARAMS)]);
4072
+ }
4073
+ const extrinsic = await this.#koniState.earningService.handleYieldChangeValidator(params);
4074
+ return await this.#koniState.transactionService.handleTransaction({
4075
+ address,
4076
+ chain: poolHandler.chain,
4077
+ transaction: extrinsic,
4078
+ data: params,
4079
+ extrinsicType: _KoniTypes.ExtrinsicType.CHANGE_EARNING_VALIDATOR,
4080
+ chainType: _KoniTypes.ChainType.SUBSTRATE
4081
+ });
4082
+ }
4064
4083
 
4065
4084
  /* Campaign */
4066
4085
 
@@ -4935,7 +4954,8 @@ class KoniExtension {
4935
4954
  return await this.yieldSubmitClaimReward(request);
4936
4955
  case 'pri(yield.getEarningSlippage)':
4937
4956
  return await this.yieldGetEarningSlippage(request);
4938
-
4957
+ case 'pri(yield.changeValidator.submit)':
4958
+ return await this.handleYieldChangeValidator(request);
4939
4959
  /* Others */
4940
4960
 
4941
4961
  /* Actions */
@@ -13,6 +13,6 @@ const packageInfo = {
13
13
  name: '@subwallet/extension-base',
14
14
  path: typeof __dirname === 'string' ? __dirname : 'auto',
15
15
  type: 'cjs',
16
- version: '1.3.47-0'
16
+ version: '1.3.48-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -689,15 +689,20 @@ class ChainService {
689
689
  const priorityTokensMap = this.priorityTokensSubject.value || {};
690
690
  const priorityTokensList = priorityTokensMap.token && typeof priorityTokensMap.token === 'object' ? Object.keys(priorityTokensMap.token) : [];
691
691
  for (const assetSlug of priorityTokensList) {
692
- const assetState = assetSettings[assetSlug];
693
692
  const assetInfo = this.getAssetBySlug(assetSlug);
693
+
694
+ // This can occur if the assetSlug is not present in the current chainlist version
695
+ if (!assetInfo) {
696
+ continue;
697
+ }
698
+ const assetState = assetSettings[assetSlug];
694
699
  const chainState = chainStateMap[assetInfo.originChain];
695
700
  if (!assetState) {
696
701
  // If this asset not has asset setting, this token is not enabled before (not turned off before)
697
702
  if (!chainState || !chainState.manualTurnOff) {
698
703
  await this.updateAssetSetting(assetSlug, {
699
704
  visible: true
700
- }, true);
705
+ }, false);
701
706
  }
702
707
  }
703
708
  }
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports._STAKING_CHAIN_GROUP = exports.TON_CHAINS = exports.ST_LIQUID_TOKEN_ABI = exports.MaxEraRewardPointsEras = exports.MANTA_VALIDATOR_POINTS_PER_BLOCK = exports.MANTA_MIN_DELEGATION = exports.CHANNEL_ID = void 0;
6
+ exports._SUPPORT_CHANGE_VALIDATOR_CHAIN = exports._STAKING_CHAIN_GROUP = exports.TON_CHAINS = exports.ST_LIQUID_TOKEN_ABI = exports.MaxEraRewardPointsEras = exports.MANTA_VALIDATOR_POINTS_PER_BLOCK = exports.MANTA_MIN_DELEGATION = exports.CHANNEL_ID = void 0;
7
7
  // Copyright 2019-2022 @subwallet/extension-base
8
8
  // SPDX-License-Identifier: Apache-2.0
9
9
 
@@ -41,4 +41,6 @@ exports.MANTA_VALIDATOR_POINTS_PER_BLOCK = MANTA_VALIDATOR_POINTS_PER_BLOCK;
41
41
  const MANTA_MIN_DELEGATION = 500;
42
42
  exports.MANTA_MIN_DELEGATION = MANTA_MIN_DELEGATION;
43
43
  const CHANNEL_ID = 7;
44
- exports.CHANNEL_ID = CHANNEL_ID;
44
+ exports.CHANNEL_ID = CHANNEL_ID;
45
+ const _SUPPORT_CHANGE_VALIDATOR_CHAIN = ['polkadot', 'kusama'];
46
+ exports._SUPPORT_CHANGE_VALIDATOR_CHAIN = _SUPPORT_CHANGE_VALIDATOR_CHAIN;
@@ -27,7 +27,8 @@ class InterlayLendingPoolHandler extends _base.default {
27
27
  fastUnstake: true,
28
28
  cancelUnstake: false,
29
29
  withdraw: false,
30
- claimReward: false
30
+ claimReward: false,
31
+ changeValidator: false
31
32
  };
32
33
  rateDecimals = 18;
33
34
  constructor(state, chain) {
@@ -34,7 +34,8 @@ class AcalaLiquidStakingPoolHandler extends _base.default {
34
34
  fastUnstake: true,
35
35
  cancelUnstake: false,
36
36
  withdraw: true,
37
- claimReward: false
37
+ claimReward: false,
38
+ changeValidator: false
38
39
  };
39
40
  constructor(state, chain) {
40
41
  super(state, chain);
@@ -33,7 +33,8 @@ class BifrostLiquidStakingPoolHandler extends _base.default {
33
33
  fastUnstake: true,
34
34
  cancelUnstake: false,
35
35
  withdraw: false,
36
- claimReward: false
36
+ claimReward: false,
37
+ changeValidator: false
37
38
  };
38
39
  rateDecimals = 0;
39
40
  constructor(state, chain) {
@@ -29,7 +29,8 @@ class ParallelLiquidStakingPoolHandler extends _base.default {
29
29
  fastUnstake: true,
30
30
  cancelUnstake: false,
31
31
  withdraw: false,
32
- claimReward: false
32
+ claimReward: false,
33
+ changeValidator: false
33
34
  };
34
35
  constructor(state, chain) {
35
36
  super(state, chain);
@@ -42,7 +42,8 @@ class StellaSwapLiquidStakingPoolHandler extends _base.default {
42
42
  fastUnstake: false,
43
43
  cancelUnstake: false,
44
44
  withdraw: true,
45
- claimReward: false
45
+ claimReward: false,
46
+ changeValidator: false
46
47
  };
47
48
  constructor(state, chain) {
48
49
  super(state, chain);
@@ -47,7 +47,8 @@ class AstarNativeStakingPoolHandler extends _basePara.default {
47
47
  fastUnstake: false,
48
48
  cancelUnstake: false,
49
49
  withdraw: true,
50
- claimReward: true
50
+ claimReward: true,
51
+ changeValidator: false
51
52
  };
52
53
 
53
54
  /* Subscribe pool info */
@@ -21,7 +21,8 @@ class BaseNativeStakingPoolHandler extends _base.default {
21
21
  fastUnstake: false,
22
22
  cancelUnstake: true,
23
23
  withdraw: true,
24
- claimReward: false
24
+ claimReward: false,
25
+ changeValidator: false
25
26
  };
26
27
  static generateSlug(symbol, chain) {
27
28
  return `${symbol}___native_staking___${chain}`;
@@ -172,6 +173,9 @@ class BaseNativeStakingPoolHandler extends _base.default {
172
173
  async handleYieldClaimReward(address, bondReward) {
173
174
  return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED));
174
175
  }
176
+ async handleChangeEarningValidator(_data) {
177
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED));
178
+ }
175
179
 
176
180
  /* Other actions */
177
181
  }
@@ -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);
@@ -401,32 +401,37 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
401
401
  isCrowded: false
402
402
  }));
403
403
  }
404
- async getMainnetPoolTargets() {
404
+ async getMainnetPoolTargets(netuid) {
405
405
  const _topValidator = await this.bittensorCache.get();
406
406
  const topValidator = _topValidator;
407
407
  const bnMinBond = new _bignumber.default(DEFAULT_DTAO_MINBOND);
408
408
  const validatorList = topValidator.data;
409
- const validatorAddresses = Object.keys(validatorList);
410
- const results = await Promise.all(validatorAddresses.map(i => {
411
- const address = validatorList[i].hotkey.ss58;
412
- const bnTotalStake = new _bignumber.default(validatorList[i].stake);
413
- const bnOwnStake = new _bignumber.default(validatorList[i].validator_stake);
414
- const otherStake = bnTotalStake.minus(bnOwnStake);
415
- const nominatorCount = validatorList[i].nominators;
416
- 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;
417
422
  const roundedCommission = (parseFloat(commission) * 100).toFixed(0);
418
- const apr = (parseFloat(validatorList[i].apr) / 10 ** 9 * 100).toFixed(2);
419
- const apyCalculate = (0, _utils4.calculateReward)(parseFloat(apr));
420
- 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;
421
426
  return {
422
427
  address: address,
423
- totalStake: bnTotalStake.toString(),
424
- ownStake: bnOwnStake.toString(),
425
- otherStake: otherStake.toString(),
428
+ totalStake: bnTotalWeightStake.toString(),
429
+ ownStake: bnRootWeightStake.toString(),
430
+ otherStake: bnAlphaStake.toString(),
426
431
  minBond: bnMinBond.toString(),
427
432
  nominatorCount: nominatorCount,
428
433
  commission: roundedCommission,
429
- expectedReturn: apyCalculate.apy,
434
+ expectedReturn: expectedReturn,
430
435
  blocked: false,
431
436
  isVerified: false,
432
437
  chain: this.chain,
@@ -436,10 +441,10 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
436
441
  }));
437
442
  return results;
438
443
  }
439
- async getPoolTargets() {
444
+ async getPoolTargets(netuid) {
440
445
  await this.init();
441
446
  if (this.chain === 'bittensor') {
442
- return this.getMainnetPoolTargets();
447
+ return this.getMainnetPoolTargets(netuid);
443
448
  } else {
444
449
  return this.getDevnetPoolTargets();
445
450
  }
@@ -456,6 +461,9 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
456
461
  selectedValidators: targetValidators,
457
462
  subnetData
458
463
  } = data;
464
+ if (!subnetData) {
465
+ throw new Error(_types.BasicTxErrorType.INVALID_PARAMS);
466
+ }
459
467
  const {
460
468
  netuid,
461
469
  slippage
@@ -465,6 +473,8 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
465
473
  const alphaToTaoPrice = new _bignumber.default(await getAlphaToTaoRate(this.substrateApi, netuid));
466
474
  const limitPrice = alphaToTaoPrice.multipliedBy(10 ** (0, _utils2._getAssetDecimals)(this.nativeToken)).multipliedBy(1 + (slippage || DEFAULT_BITTENSOR_SLIPPAGE));
467
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
468
478
  const selectedValidatorInfo = targetValidators[0];
469
479
  const hotkey = selectedValidatorInfo.address;
470
480
  const extrinsic = chainApi.api.tx.subtensorModule.addStakeLimit(hotkey, netuid, binaryAmount.toFixed(), BNlimitPrice.toFixed(), false);
@@ -473,6 +483,8 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
473
483
  amount: '0'
474
484
  }];
475
485
  }
486
+
487
+ // Validate for case stake more
476
488
  async validateYieldJoin(data, path) {
477
489
  const baseErrors = await super.validateYieldJoin(data, path);
478
490
  if (baseErrors.length > 0) {
@@ -524,5 +536,46 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
524
536
  }
525
537
 
526
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
+ }
527
580
  }
528
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 */
@@ -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) {
@@ -676,13 +694,11 @@ class RelayNativeStakingPoolHandler extends _base.default {
676
694
  const chainApi = await this.substrateApi.isReady;
677
695
  if (chainApi.api.tx.staking.withdrawUnbonded.meta.args.length === 1) {
678
696
  let slashingSpanCount;
679
- if (chainApi.api.query.staking.nominatorSlashInEra) {
680
- const currentEra = await chainApi.api.query.staking.currentEra();
681
- const slashingSpans = (await chainApi.api.query.staking.nominatorSlashInEra(currentEra.toPrimitive(), address)).toPrimitive();
682
- slashingSpanCount = slashingSpans !== null ? slashingSpans.toString() : '0';
683
- } else {
697
+ if (chainApi.api.query.staking.slashingSpans) {
684
698
  const _slashingSpans = (await chainApi.api.query.staking.slashingSpans(address)).toHuman();
685
699
  slashingSpanCount = _slashingSpans !== null ? _slashingSpans.spanIndex : '0';
700
+ } else {
701
+ slashingSpanCount = chainApi.api.consts.staking.historyDepth.toPrimitive();
686
702
  }
687
703
  return chainApi.api.tx.staking.withdrawUnbonded(slashingSpanCount);
688
704
  } else {
@@ -690,7 +706,18 @@ class RelayNativeStakingPoolHandler extends _base.default {
690
706
  return chainApi.api.tx.staking.withdrawUnbonded();
691
707
  }
692
708
  }
693
-
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
+ }
694
721
  /* Other actions */
695
722
  }
696
723
  exports.default = RelayNativeStakingPoolHandler;