@subwallet/extension-base 1.3.75-2 → 1.3.77-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 (63) hide show
  1. package/background/KoniTypes.d.ts +6 -2
  2. package/background/KoniTypes.js +1 -0
  3. package/cjs/background/KoniTypes.js +1 -0
  4. package/cjs/core/substrate/xcm-parser.js +8 -11
  5. package/cjs/koni/background/handlers/Extension.js +279 -64
  6. package/cjs/koni/background/handlers/Tabs.js +2 -3
  7. package/cjs/packageInfo.js +1 -1
  8. package/cjs/services/balance-service/index.js +6 -1
  9. package/cjs/services/chain-service/index.js +1 -1
  10. package/cjs/services/chain-service/utils/patch.js +1 -1
  11. package/cjs/services/earning-service/constants/chains.js +4 -1
  12. package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +8 -5
  13. package/cjs/services/earning-service/handlers/native-staking/dtao.js +85 -113
  14. package/cjs/services/earning-service/handlers/native-staking/tanssi.js +2 -1
  15. package/cjs/services/earning-service/handlers/native-staking/tao.js +85 -100
  16. package/cjs/services/earning-service/service.js +35 -4
  17. package/cjs/services/multisig-service/index.js +1 -1
  18. package/cjs/services/request-service/handler/SubstrateRequestHandler.js +12 -0
  19. package/cjs/services/request-service/index.js +3 -0
  20. package/cjs/services/setting-service/constants.js +2 -1
  21. package/cjs/services/storage-service/db-stores/InappNotification.js +1 -1
  22. package/cjs/services/substrate-proxy-service/constant.js +1 -1
  23. package/cjs/services/transaction-service/index.js +9 -0
  24. package/cjs/utils/account/transform.js +3 -3
  25. package/core/substrate/xcm-parser.d.ts +1 -0
  26. package/core/substrate/xcm-parser.js +7 -11
  27. package/koni/background/handlers/Extension.d.ts +20 -0
  28. package/koni/background/handlers/Extension.js +218 -6
  29. package/koni/background/handlers/Tabs.js +2 -3
  30. package/package.json +6 -6
  31. package/packageInfo.js +1 -1
  32. package/services/balance-service/index.js +6 -1
  33. package/services/chain-service/index.js +1 -1
  34. package/services/chain-service/utils/patch.d.ts +1 -1
  35. package/services/chain-service/utils/patch.js +1 -1
  36. package/services/earning-service/constants/chains.d.ts +1 -0
  37. package/services/earning-service/constants/chains.js +2 -0
  38. package/services/earning-service/handlers/liquid-staking/stella-swap.d.ts +1 -0
  39. package/services/earning-service/handlers/liquid-staking/stella-swap.js +6 -4
  40. package/services/earning-service/handlers/native-staking/dtao.d.ts +2 -10
  41. package/services/earning-service/handlers/native-staking/dtao.js +86 -116
  42. package/services/earning-service/handlers/native-staking/tanssi.js +2 -1
  43. package/services/earning-service/handlers/native-staking/tao.d.ts +4 -3
  44. package/services/earning-service/handlers/native-staking/tao.js +84 -101
  45. package/services/earning-service/service.d.ts +2 -1
  46. package/services/earning-service/service.js +37 -6
  47. package/services/inapp-notification-service/interfaces.d.ts +1 -0
  48. package/services/multisig-service/index.js +1 -1
  49. package/services/request-service/handler/SubstrateRequestHandler.d.ts +1 -0
  50. package/services/request-service/handler/SubstrateRequestHandler.js +12 -0
  51. package/services/request-service/index.d.ts +1 -0
  52. package/services/request-service/index.js +3 -0
  53. package/services/request-service/types.d.ts +1 -0
  54. package/services/setting-service/constants.js +2 -1
  55. package/services/storage-service/db-stores/InappNotification.js +1 -1
  56. package/services/substrate-proxy-service/constant.js +1 -1
  57. package/services/transaction-service/index.d.ts +1 -1
  58. package/services/transaction-service/index.js +9 -0
  59. package/types/balance/transfer.d.ts +2 -0
  60. package/types/multisig/index.d.ts +12 -0
  61. package/types/yield/actions/join/submit.d.ts +8 -1
  62. package/types/yield/info/account/info.d.ts +11 -5
  63. package/utils/account/transform.js +3 -3
@@ -1,5 +1,5 @@
1
1
  import { _ChainAsset, _ChainInfo, _MultiChainAsset } from '@subwallet/chain-list/types';
2
- export declare const ChainListVersion = "0.2.123";
2
+ export declare const ChainListVersion = "0.2.126";
3
3
  export interface PatchInfo {
4
4
  patchVersion: string;
5
5
  appliedVersion: string;
@@ -5,7 +5,7 @@ const PRODUCTION_BRANCHES = ['master', 'webapp', 'webapp-dev'];
5
5
  const branchName = process.env.BRANCH_NAME || 'subwallet-dev';
6
6
  const fetchDomain = process.env.PATCH_CHAIN_LIST_URL || (PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'https://chain-list-assets.subwallet.app' : 'https://dev.sw-chain-list-assets.pages.dev');
7
7
  const fetchFile = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'list.json' : 'preview.json';
8
- export const ChainListVersion = '0.2.123'; // update this when build chain-list
8
+ export const ChainListVersion = '0.2.126'; // update this when build chain-list
9
9
 
10
10
  // todo: move this interface to chainlist
11
11
 
@@ -17,6 +17,7 @@ export declare const _STAKING_CHAIN_GROUP: {
17
17
  mythos: string[];
18
18
  tanssi: string[];
19
19
  };
20
+ export declare const SUNSETTED_YIELD_POOL_SLUGS: string[];
20
21
  export declare const RELAY_HANDLER_DIRECT_STAKING_CHAINS: string[];
21
22
  export declare const TON_CHAINS: string[];
22
23
  export declare const MaxEraRewardPointsEras = 14;
@@ -1,6 +1,7 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-base
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
+ import { STELLA_SWAP_LIQUID_STAKING_SLUG } from "../handlers/liquid-staking/stella-swap.js";
4
5
  export const _STAKING_CHAIN_GROUP = {
5
6
  relay: ['polkadot', 'kusama', 'aleph', 'polkadex', 'ternoa', 'alephTest', 'polkadexTest', 'westend', 'kate', 'edgeware', 'creditcoin', 'vara_network', 'goldberg_testnet', 'availTuringTest', 'avail_mainnet', 'vara_testnet', 'dentnet', 'cere', 'zkverify', 'zkverify_testnet', 'paseoTest'],
6
7
  assetHub: ['statemine', 'statemint', 'westend_assethub', 'paseo_assethub'],
@@ -22,6 +23,7 @@ export const _STAKING_CHAIN_GROUP = {
22
23
  mythos: ['mythos', 'muse_testnet'],
23
24
  tanssi: ['tanssi', 'dancelight']
24
25
  };
26
+ export const SUNSETTED_YIELD_POOL_SLUGS = [STELLA_SWAP_LIQUID_STAKING_SLUG, 'MANTA___native_staking___manta_network'];
25
27
  export const RELAY_HANDLER_DIRECT_STAKING_CHAINS = [..._STAKING_CHAIN_GROUP.relay, ..._STAKING_CHAIN_GROUP.assetHub];
26
28
  export const TON_CHAINS = ['ton', 'ton_testnet'];
27
29
  export const MaxEraRewardPointsEras = 14;
@@ -6,6 +6,7 @@ import { BaseYieldStepDetail, HandleYieldStepData, LiquidYieldPoolInfo, OptimalY
6
6
  import { Contract } from 'web3-eth-contract';
7
7
  import BaseLiquidStakingPoolHandler from './base';
8
8
  export declare const getStellaswapLiquidStakingContract: (networkKey: string, assetAddress: string, evmApi: _EvmApi, options?: {}) => Contract;
9
+ export declare const STELLA_SWAP_LIQUID_STAKING_SLUG = "xcDOT___liquid_staking___stellaswap";
9
10
  export default class StellaSwapLiquidStakingPoolHandler extends BaseLiquidStakingPoolHandler {
10
11
  slug: string;
11
12
  protected readonly name: string;
@@ -19,6 +19,7 @@ export const getStellaswapLiquidStakingContract = (networkKey, assetAddress, evm
19
19
  const APR_STATS_URL = 'https://stdot-apr.stellaswap.com/';
20
20
  const SUBWALLET_REFERRAL = '0x7e6815f45E624768548d085231f2d453f16FD7DD';
21
21
  const TOP_HOLDER = '0x4300e09284e3bB4d9044DdAB31EfAF5f3301DABa';
22
+ export const STELLA_SWAP_LIQUID_STAKING_SLUG = 'xcDOT___liquid_staking___stellaswap';
22
23
  export default class StellaSwapLiquidStakingPoolHandler extends BaseLiquidStakingPoolHandler {
23
24
  inputAsset = 'moonbeam-LOCAL-xcDOT';
24
25
  altInputAsset = '';
@@ -28,8 +29,8 @@ export default class StellaSwapLiquidStakingPoolHandler extends BaseLiquidStakin
28
29
  transactionChainType = ChainType.EVM;
29
30
  rateDecimals = 10; // Derivative asset decimals
30
31
  availableMethod = {
31
- join: true,
32
- defaultUnstake: true,
32
+ join: false,
33
+ defaultUnstake: false,
33
34
  fastUnstake: false,
34
35
  cancelUnstake: false,
35
36
  withdraw: true,
@@ -38,7 +39,7 @@ export default class StellaSwapLiquidStakingPoolHandler extends BaseLiquidStakin
38
39
  };
39
40
  constructor(state, chain) {
40
41
  super(state, chain);
41
- this.slug = 'xcDOT___liquid_staking___stellaswap';
42
+ this.slug = STELLA_SWAP_LIQUID_STAKING_SLUG;
42
43
  this.name = 'StellaSwap Liquid Staking';
43
44
  this._logo = 'stellaswap';
44
45
  this.shortName = 'StellaSwap';
@@ -161,7 +162,8 @@ export default class StellaSwapLiquidStakingPoolHandler extends BaseLiquidStakin
161
162
  unstakeBalance: unlockBalance.toString(),
162
163
  isBondedBefore: totalBalance.gt(BN_ZERO),
163
164
  derivativeToken: derivativeTokenSlug,
164
- status: activeBalance.gt(BN_ZERO) ? EarningStatus.EARNING_REWARD : EarningStatus.NOT_EARNING,
165
+ // StellaSwap announced all stDOT positions are auto-unstaking, so rewards are no longer earned.
166
+ status: EarningStatus.NOT_EARNING,
165
167
  nominations: [],
166
168
  unstakings
167
169
  };
@@ -1,6 +1,6 @@
1
1
  import { _ChainInfo } from '@subwallet/chain-list/types';
2
2
  import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
3
- import { BaseYieldPositionInfo, RequestEarningImpact, YieldPoolInfo, YieldPoolType, YieldPositionInfo } from '@subwallet/extension-base/types';
3
+ import { BaseYieldPositionInfo, RequestEarningImpact, TransactionData, YieldPoolInfo, YieldPoolType, YieldPositionInfo } from '@subwallet/extension-base/types';
4
4
  import TaoNativeStakingPoolHandler, { TaoStakingStakeOption } from './tao';
5
5
  export interface SubnetData {
6
6
  netuid: number;
@@ -11,15 +11,6 @@ export interface SubnetData {
11
11
  taoIn: number;
12
12
  taoInEmission: number;
13
13
  }
14
- export interface RawDelegateState {
15
- data: Array<{
16
- hotkey_name: string;
17
- hotkey: {
18
- ss58: string;
19
- };
20
- stake: string;
21
- }>;
22
- }
23
14
  export interface EarningImpactResult {
24
15
  slippage: number;
25
16
  rate: number;
@@ -40,4 +31,5 @@ export default class SubnetTaoStakingPoolHandler extends TaoNativeStakingPoolHan
40
31
  subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
41
32
  parseNominatorMetadata(chainInfo: _ChainInfo, delegatorState: TaoStakingStakeOption[], netuid?: number): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
42
33
  subscribePoolPosition(useAddresses: string[], rsCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
34
+ handleChangeRootClaimType(): Promise<TransactionData>;
43
35
  }
@@ -1,57 +1,15 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-base
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
+ import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
4
5
  import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
5
6
  import { BITTENSOR_REFRESH_STAKE_APY, BITTENSOR_REFRESH_STAKE_INFO } from '@subwallet/extension-base/constants';
6
- import { EarningStatus, YieldPoolType } from '@subwallet/extension-base/types';
7
+ import { BasicTxErrorType, EarningStatus, YieldPoolType } from '@subwallet/extension-base/types';
7
8
  import { reformatAddress } from '@subwallet/extension-base/utils';
8
9
  import BigN from 'bignumber.js';
9
- import { BN, BN_ZERO } from '@polkadot/util';
10
+ import { BN_ZERO } from '@polkadot/util';
10
11
  import TaoNativeStakingPoolHandler, { DEFAULT_DTAO_MINBOND } from "./tao.js";
11
-
12
- // interface ApiResponse {
13
- // data: SubnetData[];
14
- // }
15
-
16
- // interface PoolData {
17
- // netuid: number;
18
- // name: string;
19
- // symbol: string;
20
- // }
21
-
22
- // interface PoolApiResponse {
23
- // data: PoolData[];
24
- // }
25
-
26
- // const SUBNET_API_URL = 'https://dash.taostats.io/api/subnet';
27
- // const POOL_API_URL = 'https://dash.taostats.io/api/dtao/pool';
28
-
29
- // export async function fetchSubnetData () {
30
- // try {
31
- // const [subnetResponse, poolResponse] = await Promise.all([
32
- // fetch(SUBNET_API_URL).then((res) => res.json()) as Promise<ApiResponse>,
33
- // fetch(POOL_API_URL).then((res) => res.json()) as Promise<PoolApiResponse>
34
- // ]);
35
-
36
- // const poolMap = new Map(poolResponse.data.map((pool) => [pool.netuid, pool]));
37
-
38
- // const filteredSubnets = subnetResponse.data.filter((subnet) => subnet.netuid !== 0);
39
-
40
- // const mergedData = filteredSubnets.map((subnet) => ({
41
- // ...subnet,
42
- // name: poolMap.get(subnet.netuid)?.name || 'Unknown',
43
- // symbol: poolMap.get(subnet.netuid)?.symbol || 'Unknown'
44
- // }));
45
-
46
- // return mergedData;
47
- // } catch (err) {
48
- // console.error('Error:', err);
49
-
50
- // return [];
51
- // }
52
- // }
53
-
54
- const getAlphaToTaoMapping = async substrateApi => {
12
+ const getAlphaToTaoRateMap = async substrateApi => {
55
13
  const allSubnets = (await substrateApi.api.call.subnetInfoRuntimeApi.getAllDynamicInfo()).toJSON();
56
14
  if (!allSubnets || allSubnets.length === 0) {
57
15
  return {};
@@ -244,87 +202,91 @@ export default class SubnetTaoStakingPoolHandler extends TaoNativeStakingPoolHan
244
202
  const chainInfo = this.chainInfo;
245
203
  const _delegateInfo = await this.bittensorCache.get();
246
204
  const getPoolPosition = async () => {
247
- const rawDelegateStateInfos = await Promise.all(useAddresses.map(async address => (await substrateApi.api.call.stakeInfoRuntimeApi.getStakeInfoForColdkey(address)).toJSON()));
248
- const price = await getAlphaToTaoMapping(this.substrateApi);
249
- if (rawDelegateStateInfos && rawDelegateStateInfos.length > 0) {
250
- rawDelegateStateInfos.forEach((rawDelegateStateInfo, i) => {
251
- const owner = reformatAddress(useAddresses[i], 42);
252
- const delegateStateInfo = rawDelegateStateInfo;
253
- const subnetPositions = {};
254
- for (const delegate of delegateStateInfo) {
255
- const hotkey = delegate.hotkey;
256
- const netuid = delegate.netuid;
257
- const stake = new BigN(delegate.stake);
258
- const aplhaToTaoPrice = new BigN(price[netuid]);
259
- if (!subnetPositions[netuid]) {
260
- subnetPositions[netuid] = {
261
- delegatorState: [],
262
- totalBalance: BN_ZERO,
263
- originalTotalStake: BN_ZERO
264
- };
265
- }
266
- let identity = '';
267
- if (_delegateInfo) {
268
- const delegateInfo = _delegateInfo.data.find(info => info.hotkey.ss58 === hotkey);
269
- identity = delegateInfo ? delegateInfo.name : '';
270
- }
271
- subnetPositions[netuid].delegatorState.push({
272
- owner: hotkey,
273
- amount: stake.toString(),
274
- rate: aplhaToTaoPrice,
275
- identity: identity
276
- });
277
- subnetPositions[netuid].totalBalance = subnetPositions[netuid].totalBalance.add(new BN(stake.toString()));
278
- subnetPositions[netuid].originalTotalStake = subnetPositions[netuid].originalTotalStake.add(new BN(stake.toString()));
205
+ const rawDelegateStateInfos = await substrateApi.api.call.stakeInfoRuntimeApi.getStakeInfoForColdkeys(useAddresses);
206
+ const delegateStateInfos = rawDelegateStateInfos.toPrimitive();
207
+ const alphaToTaoRateMap = await getAlphaToTaoRateMap(this.substrateApi);
208
+ if (!delegateStateInfos || delegateStateInfos.length === 0) {
209
+ return;
210
+ }
211
+ delegateStateInfos.forEach(([coldkey, stakeInfos]) => {
212
+ const owner = reformatAddress(coldkey, 42);
213
+ const subnetPositions = {};
214
+ for (const delegate of stakeInfos) {
215
+ const hotkey = delegate.hotkey;
216
+ const netuid = delegate.netuid;
217
+ if (netuid === 0) {
218
+ continue;
219
+ }
220
+ const stake = new BigN(delegate.stake);
221
+ const alphaToTaoPrice = new BigN(alphaToTaoRateMap[netuid]);
222
+ if (!subnetPositions[netuid]) {
223
+ subnetPositions[netuid] = {
224
+ delegatorState: [],
225
+ totalBalance: BigN(0),
226
+ originalTotalStake: BigN(0)
227
+ };
279
228
  }
280
- Object.values(this.subnetData).forEach(subnet => {
281
- const netuid = subnet.netuid;
282
- const subnetSlug = `${this.slug}__subnet_${netuid.toString().padStart(2, '0')}`;
283
- const subnetName = `${subnet.name || 'Unknown'} ${netuid}`;
284
- const subnetSymbol = subnet.symbol || 'dTAO';
285
- const {
286
- delegatorState = [],
287
- originalTotalStake = BN_ZERO
288
- } = subnetPositions[netuid] || {};
289
- if (delegatorState.length > 0) {
290
- this.parseNominatorMetadata(chainInfo, delegatorState, netuid).then(nominatorMetadata => {
291
- rsCallback({
292
- ...defaultInfo,
293
- ...nominatorMetadata,
294
- address: owner,
295
- type: this.type,
296
- slug: subnetSlug,
297
- subnetData: {
298
- subnetSymbol,
299
- subnetShortName: subnetName,
300
- originalTotalStake: originalTotalStake.toString()
301
- }
302
- });
303
- }).catch(console.error);
304
- } else {
229
+ let identity = '';
230
+ if (_delegateInfo) {
231
+ const delegateInfo = _delegateInfo.data.find(info => info.hotkey.ss58 === hotkey);
232
+ identity = delegateInfo ? delegateInfo.name : '';
233
+ }
234
+ subnetPositions[netuid].delegatorState.push({
235
+ owner: hotkey,
236
+ amount: stake.toString(),
237
+ rate: alphaToTaoPrice,
238
+ identity
239
+ });
240
+ subnetPositions[netuid].totalBalance = subnetPositions[netuid].totalBalance.plus(new BigN(stake.toString()));
241
+ subnetPositions[netuid].originalTotalStake = subnetPositions[netuid].originalTotalStake.plus(new BigN(stake.toString()));
242
+ }
243
+ Object.values(this.subnetData).forEach(subnet => {
244
+ const netuid = subnet.netuid;
245
+ const subnetSlug = `${this.slug}__subnet_${netuid.toString().padStart(2, '0')}`;
246
+ const subnetName = `${subnet.name || 'Unknown'} ${netuid}`;
247
+ const subnetSymbol = subnet.symbol || 'dTAO';
248
+ const {
249
+ delegatorState = [],
250
+ originalTotalStake = BN_ZERO
251
+ } = subnetPositions[netuid] || {};
252
+ if (delegatorState.length > 0) {
253
+ this.parseNominatorMetadata(chainInfo, delegatorState, netuid).then(nominatorMetadata => {
305
254
  rsCallback({
306
255
  ...defaultInfo,
307
- type: this.type,
256
+ ...nominatorMetadata,
308
257
  address: owner,
309
- balanceToken: this.nativeToken.slug,
310
- totalStake: '0',
311
- activeStake: '0',
312
- unstakeBalance: '0',
313
- status: EarningStatus.NOT_STAKING,
314
- isBondedBefore: false,
315
- nominations: [],
316
- unstakings: [],
258
+ type: this.type,
317
259
  slug: subnetSlug,
318
260
  subnetData: {
319
261
  subnetSymbol,
320
262
  subnetShortName: subnetName,
321
- originalTotalStake: '0'
263
+ originalTotalStake: originalTotalStake.toString()
322
264
  }
323
265
  });
324
- }
325
- });
266
+ }).catch(console.error);
267
+ } else {
268
+ rsCallback({
269
+ ...defaultInfo,
270
+ type: this.type,
271
+ address: owner,
272
+ balanceToken: this.nativeToken.slug,
273
+ totalStake: '0',
274
+ activeStake: '0',
275
+ unstakeBalance: '0',
276
+ status: EarningStatus.NOT_STAKING,
277
+ isBondedBefore: false,
278
+ nominations: [],
279
+ unstakings: [],
280
+ slug: subnetSlug,
281
+ subnetData: {
282
+ subnetSymbol,
283
+ subnetShortName: subnetName,
284
+ originalTotalStake: '0'
285
+ }
286
+ });
287
+ }
326
288
  });
327
- }
289
+ });
328
290
  };
329
291
  const getStakingPositionInterval = async () => {
330
292
  if (cancel) {
@@ -343,4 +305,12 @@ export default class SubnetTaoStakingPoolHandler extends TaoNativeStakingPoolHan
343
305
  }
344
306
 
345
307
  /* Subscribe pool position */
308
+
309
+ /* Unimplemented function */
310
+
311
+ handleChangeRootClaimType() {
312
+ return Promise.reject(new TransactionError(BasicTxErrorType.UNSUPPORTED));
313
+ }
314
+
315
+ /* Unimplemented function */
346
316
  }
@@ -291,7 +291,8 @@ export default class TanssiNativeStakingPoolHandler extends BaseParaNativeStakin
291
291
  metadata: {
292
292
  pendingStake: bnJoiningStake.toString(),
293
293
  compoundingStake: bnCompoundingStake.toString(),
294
- manualStake: bnManualStake.toString()
294
+ manualStake: bnManualStake.toString(),
295
+ isShowActiveStakeDetails: bnJoiningStake.gt(0) || bnCompoundingStake.gt(0) || !bnManualStake.gt(0)
295
296
  }
296
297
  });
297
298
  };
@@ -4,7 +4,7 @@ import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
4
4
  import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
5
5
  import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
6
6
  import BaseParaStakingPoolHandler from '@subwallet/extension-base/services/earning-service/handlers/native-staking/base-para';
7
- import { BaseYieldPositionInfo, OptimalYieldPath, StakeCancelWithdrawalParams, SubmitBittensorChangeValidatorStaking, SubmitJoinNativeStaking, TransactionData, UnstakingInfo, ValidatorInfo, YieldPoolInfo, YieldPoolMethodInfo, YieldPositionInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
7
+ import { BaseYieldPositionInfo, BittensorRootClaimType, OptimalYieldPath, StakeCancelWithdrawalParams, SubmitBittensorChangeValidatorStaking, SubmitJoinNativeStaking, TransactionData, UnstakingInfo, ValidatorInfo, YieldPoolInfo, YieldPoolMethodInfo, YieldPositionInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
8
8
  import BigN from 'bignumber.js';
9
9
  declare type Nominators = [Array<[number, number]>];
10
10
  export interface TestnetBittensorDelegateInfo {
@@ -88,8 +88,6 @@ export default class TaoNativeStakingPoolHandler extends BaseParaStakingPoolHand
88
88
  protected bittensorCache: BittensorCache;
89
89
  protected getMinBond(netuid?: number): Promise<BigN>;
90
90
  constructor(state: KoniState, chain: string);
91
- handleYieldWithdraw(address: string, unstakingInfo: UnstakingInfo): Promise<TransactionData>;
92
- handleYieldCancelUnstake(params: StakeCancelWithdrawalParams): Promise<TransactionData>;
93
91
  get maintainBalance(): string;
94
92
  subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
95
93
  protected parseNominatorMetadataBase(chainInfo: _ChainInfo, delegatorState: TaoStakingStakeOption[], minBond: string, applyRate?: boolean): Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>;
@@ -104,5 +102,8 @@ export default class TaoNativeStakingPoolHandler extends BaseParaStakingPoolHand
104
102
  handleYieldUnstake(amount: string, address: string, selectedTarget?: string, netuid?: number, slippage?: number): Promise<[ExtrinsicType, TransactionData]>;
105
103
  validateYieldLeave(amount: string, address: string, fastLeave: boolean, selectedTarget?: string, slug?: string, poolInfo?: YieldPoolInfo): Promise<TransactionError[]>;
106
104
  handleChangeEarningValidator(data: SubmitBittensorChangeValidatorStaking): Promise<TransactionData>;
105
+ handleChangeRootClaimType(type: BittensorRootClaimType): Promise<TransactionData>;
106
+ handleYieldWithdraw(address: string, unstakingInfo: UnstakingInfo): Promise<TransactionData>;
107
+ handleYieldCancelUnstake(params: StakeCancelWithdrawalParams): Promise<TransactionData>;
107
108
  }
108
109
  export {};
@@ -113,36 +113,6 @@ export class BittensorCache {
113
113
  }
114
114
  }
115
115
  }
116
-
117
- // export async function fetchTaoDelegateState (address: string): Promise<RawDelegateState> {
118
- // const apiKey = bittensorApiKey();
119
-
120
- // return new Promise(function (resolve) {
121
- // fetch(`https://api.taostats.io/api/stake_balance/latest/v1?coldkey=${address}`, {
122
- // method: 'GET',
123
- // headers: {
124
- // 'Content-Type': 'application/json',
125
- // Authorization: `${apiKey}`
126
- // }
127
- // }).then((resp) => {
128
- // resolve(resp.json());
129
- // }).catch(console.error);
130
- // });
131
- // }
132
-
133
- /* Fetch data */
134
-
135
- // const testnetDelegate = {
136
- // '5G6wdAdS7hpBuH1tjuZDhpzrGw9Wf71WEVakDCxHDm1cxEQ2': {
137
- // name: '0x436c6f776e4e616d65f09fa4a1',
138
- // url: 'https://example.com ',
139
- // image: 'https://example.com/image.png',
140
- // discord: '0xe28094446973636f7264',
141
- // description: 'This is an example identity.',
142
- // additional: ''
143
- // }
144
- // };
145
-
146
116
  export const getAlphaToTaoRate = async (substrateApi, netuid) => {
147
117
  const subnetInfo = (await substrateApi.api.call.subnetInfoRuntimeApi.getDynamicInfo(netuid)).toJSON();
148
118
  if (!subnetInfo) {
@@ -196,20 +166,9 @@ export default class TaoNativeStakingPoolHandler extends BaseParaStakingPoolHand
196
166
  super(state, chain);
197
167
  this.bittensorCache = BittensorCache.getInstance();
198
168
  }
199
-
200
- /* Unimplemented function */
201
- handleYieldWithdraw(address, unstakingInfo) {
202
- return Promise.reject(new TransactionError(BasicTxErrorType.UNSUPPORTED));
203
- }
204
- handleYieldCancelUnstake(params) {
205
- return Promise.reject(new TransactionError(BasicTxErrorType.UNSUPPORTED));
206
- }
207
- /* Unimplemented function */
208
-
209
169
  get maintainBalance() {
210
170
  const ed = new BigN(this.nativeToken.minAmount || '0');
211
- const calculateMaintainBalance = new BigN(15).multipliedBy(ed).dividedBy(10);
212
- const maintainBalance = calculateMaintainBalance;
171
+ const maintainBalance = new BigN(15).multipliedBy(ed).dividedBy(10);
213
172
  return maintainBalance.toString();
214
173
  }
215
174
 
@@ -333,66 +292,74 @@ export default class TaoNativeStakingPoolHandler extends BaseParaStakingPoolHand
333
292
  const chainInfo = this.chainInfo;
334
293
  const _delegateInfo = await this.bittensorCache.get();
335
294
  const getPoolPosition = async () => {
336
- const rawDelegateStateInfos = await Promise.all(useAddresses.map(async address => (await substrateApi.api.call.stakeInfoRuntimeApi.getStakeInfoForColdkey(address)).toJSON()));
337
- if (rawDelegateStateInfos && rawDelegateStateInfos.length > 0) {
338
- rawDelegateStateInfos.forEach((rawDelegateStateInfo, i) => {
339
- const owner = reformatAddress(useAddresses[i], 42);
340
- const delegatorState = [];
341
- let bnTotalBalance = BN_ZERO;
342
- const delegateStateInfo = rawDelegateStateInfo;
343
- const totalDelegate = {};
344
- for (const delegate of delegateStateInfo) {
345
- const hotkey = delegate.hotkey;
346
- const netuid = delegate.netuid;
347
- const stake = new BigN(delegate.stake);
348
- if (netuid === 0) {
349
- const taoStake = stake.toFixed(0);
350
- if (totalDelegate[hotkey]) {
351
- totalDelegate[hotkey] = new BigN(totalDelegate[hotkey]).plus(taoStake).toFixed();
352
- } else {
353
- totalDelegate[hotkey] = taoStake;
354
- }
295
+ const rawDelegateStateInfo = await substrateApi.api.call.stakeInfoRuntimeApi.getStakeInfoForColdkeys(useAddresses);
296
+ const delegateStateInfo = rawDelegateStateInfo.toPrimitive();
297
+ const rootClaimType = await substrateApi.api.query.subtensorModule.rootClaimType.multi(useAddresses);
298
+ if (!delegateStateInfo || delegateStateInfo.length === 0) {
299
+ return;
300
+ }
301
+ delegateStateInfo.forEach(([coldkey, stakeInfos], i) => {
302
+ var _rootClaimType$i;
303
+ const owner = reformatAddress(coldkey, 42);
304
+ const delegatorState = [];
305
+ let bnTotalBalance = BN_ZERO;
306
+ const totalDelegate = {};
307
+ for (const delegate of stakeInfos) {
308
+ const hotkey = delegate.hotkey;
309
+ const netuid = delegate.netuid;
310
+ const stake = new BigN(delegate.stake);
311
+ if (netuid === 0) {
312
+ const taoStake = stake.toFixed(0);
313
+ if (totalDelegate[hotkey]) {
314
+ totalDelegate[hotkey] = new BigN(totalDelegate[hotkey]).plus(taoStake).toFixed();
315
+ } else {
316
+ totalDelegate[hotkey] = taoStake;
355
317
  }
356
318
  }
357
- for (const hotkey in totalDelegate) {
358
- bnTotalBalance = bnTotalBalance.add(new BN(totalDelegate[hotkey]));
359
- let identity = '';
360
- if (_delegateInfo) {
361
- const delegateInfo = _delegateInfo.data.find(info => info.hotkey.ss58 === hotkey);
362
- identity = delegateInfo ? delegateInfo.name : '';
363
- }
364
- delegatorState.push({
365
- owner: hotkey,
366
- amount: totalDelegate[hotkey],
367
- identity: identity
368
- });
319
+ }
320
+ for (const hotkey in totalDelegate) {
321
+ bnTotalBalance = bnTotalBalance.add(new BN(totalDelegate[hotkey]));
322
+ let identity = '';
323
+ if (_delegateInfo) {
324
+ const delegateInfo = _delegateInfo.data.find(info => info.hotkey.ss58 === hotkey);
325
+ identity = delegateInfo ? delegateInfo.name : '';
369
326
  }
370
- if (delegateStateInfo && delegateStateInfo.length > 0) {
371
- this.parseNominatorMetadata(chainInfo, delegatorState).then(nominatorMetadata => {
372
- rsCallback({
373
- ...defaultInfo,
374
- ...nominatorMetadata,
375
- address: owner,
376
- type: this.type
377
- });
378
- }).catch(console.error);
379
- } else {
327
+ delegatorState.push({
328
+ owner: hotkey,
329
+ amount: totalDelegate[hotkey],
330
+ identity: identity
331
+ });
332
+ }
333
+ const rawType = (_rootClaimType$i = rootClaimType[i]) === null || _rootClaimType$i === void 0 ? void 0 : _rootClaimType$i.toString();
334
+ const rootClaimForAddress = rawType === 'Swap' || rawType === 'Keep' ? rawType : 'Others';
335
+ if (delegateStateInfo && delegateStateInfo.length > 0) {
336
+ this.parseNominatorMetadata(chainInfo, delegatorState).then(nominatorMetadata => {
380
337
  rsCallback({
381
338
  ...defaultInfo,
382
- type: this.type,
339
+ ...nominatorMetadata,
383
340
  address: owner,
384
- balanceToken: this.nativeToken.slug,
385
- totalStake: '0',
386
- activeStake: '0',
387
- unstakeBalance: '0',
388
- status: EarningStatus.NOT_STAKING,
389
- isBondedBefore: false,
390
- nominations: [],
391
- unstakings: []
341
+ metadata: {
342
+ bittensorRootClaimType: rootClaimForAddress
343
+ },
344
+ type: this.type
392
345
  });
393
- }
394
- });
395
- }
346
+ }).catch(console.error);
347
+ } else {
348
+ rsCallback({
349
+ ...defaultInfo,
350
+ type: this.type,
351
+ address: owner,
352
+ balanceToken: this.nativeToken.slug,
353
+ totalStake: '0',
354
+ activeStake: '0',
355
+ unstakeBalance: '0',
356
+ status: EarningStatus.NOT_STAKING,
357
+ isBondedBefore: false,
358
+ nominations: [],
359
+ unstakings: []
360
+ });
361
+ }
362
+ });
396
363
  };
397
364
  const getStakingPositionInterval = async () => {
398
365
  if (cancel) {
@@ -440,8 +407,7 @@ export default class TaoNativeStakingPoolHandler extends BaseParaStakingPoolHand
440
407
  }));
441
408
  }
442
409
  async getMainnetPoolTargets(netuid) {
443
- const _topValidator = await this.bittensorCache.get();
444
- const topValidator = _topValidator;
410
+ const topValidator = await this.bittensorCache.get();
445
411
  const bnMinBond = await this.getMinBond();
446
412
  const validatorList = topValidator.data;
447
413
  const aprResponse = await this.bittensorCache.fetchApr(netuid);
@@ -449,7 +415,7 @@ export default class TaoNativeStakingPoolHandler extends BaseParaStakingPoolHand
449
415
  aprResponse.data.forEach(item => {
450
416
  aprMap[item.hotkey.ss58] = item.thirty_day_apy;
451
417
  });
452
- const results = await Promise.all(validatorList.map(validator => {
418
+ return await Promise.all(validatorList.map(validator => {
453
419
  const address = validator.hotkey.ss58;
454
420
  // With bittensor we use total weight, root weight and alpha staked insted of total stake, own stake and other stake
455
421
  const bnTotalWeightStake = new BigN(validator.global_weighted_stake);
@@ -477,7 +443,6 @@ export default class TaoNativeStakingPoolHandler extends BaseParaStakingPoolHand
477
443
  identity: name
478
444
  };
479
445
  }));
480
- return results;
481
446
  }
482
447
  async getPoolTargets(netuid) {
483
448
  if (this.chain === 'bittensor') {
@@ -625,7 +590,25 @@ export default class TaoNativeStakingPoolHandler extends BaseParaStakingPoolHand
625
590
  }
626
591
  })));
627
592
  }
628
- const extrinsic = chainApi.api.tx.subtensorModule.moveStake(originValidator, destValidator, netuid, netuid, amount);
629
- return extrinsic;
593
+ return chainApi.api.tx.subtensorModule.moveStake(originValidator, destValidator, netuid, netuid, amount);
630
594
  }
595
+
596
+ /* Others function */
597
+ async handleChangeRootClaimType(type) {
598
+ if (type !== 'Keep' && type !== 'Swap') {
599
+ return Promise.reject(new TransactionError(BasicTxErrorType.INVALID_PARAMS));
600
+ }
601
+ const chainApi = await this.substrateApi.isReady;
602
+ return chainApi.api.tx.subtensorModule.setRootClaimType(type);
603
+ }
604
+ /* Others function */
605
+
606
+ /* Unimplemented function */
607
+ handleYieldWithdraw(address, unstakingInfo) {
608
+ return Promise.reject(new TransactionError(BasicTxErrorType.UNSUPPORTED));
609
+ }
610
+ handleYieldCancelUnstake(params) {
611
+ return Promise.reject(new TransactionError(BasicTxErrorType.UNSUPPORTED));
612
+ }
613
+ /* Unimplemented function */
631
614
  }