@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.
- package/background/KoniTypes.d.ts +6 -2
- package/background/KoniTypes.js +1 -0
- package/cjs/background/KoniTypes.js +1 -0
- package/cjs/core/substrate/xcm-parser.js +8 -11
- package/cjs/koni/background/handlers/Extension.js +279 -64
- package/cjs/koni/background/handlers/Tabs.js +2 -3
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/index.js +6 -1
- package/cjs/services/chain-service/index.js +1 -1
- package/cjs/services/chain-service/utils/patch.js +1 -1
- package/cjs/services/earning-service/constants/chains.js +4 -1
- package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +8 -5
- package/cjs/services/earning-service/handlers/native-staking/dtao.js +85 -113
- package/cjs/services/earning-service/handlers/native-staking/tanssi.js +2 -1
- package/cjs/services/earning-service/handlers/native-staking/tao.js +85 -100
- package/cjs/services/earning-service/service.js +35 -4
- package/cjs/services/multisig-service/index.js +1 -1
- package/cjs/services/request-service/handler/SubstrateRequestHandler.js +12 -0
- package/cjs/services/request-service/index.js +3 -0
- package/cjs/services/setting-service/constants.js +2 -1
- package/cjs/services/storage-service/db-stores/InappNotification.js +1 -1
- package/cjs/services/substrate-proxy-service/constant.js +1 -1
- package/cjs/services/transaction-service/index.js +9 -0
- package/cjs/utils/account/transform.js +3 -3
- package/core/substrate/xcm-parser.d.ts +1 -0
- package/core/substrate/xcm-parser.js +7 -11
- package/koni/background/handlers/Extension.d.ts +20 -0
- package/koni/background/handlers/Extension.js +218 -6
- package/koni/background/handlers/Tabs.js +2 -3
- package/package.json +6 -6
- package/packageInfo.js +1 -1
- package/services/balance-service/index.js +6 -1
- package/services/chain-service/index.js +1 -1
- package/services/chain-service/utils/patch.d.ts +1 -1
- package/services/chain-service/utils/patch.js +1 -1
- package/services/earning-service/constants/chains.d.ts +1 -0
- package/services/earning-service/constants/chains.js +2 -0
- package/services/earning-service/handlers/liquid-staking/stella-swap.d.ts +1 -0
- package/services/earning-service/handlers/liquid-staking/stella-swap.js +6 -4
- package/services/earning-service/handlers/native-staking/dtao.d.ts +2 -10
- package/services/earning-service/handlers/native-staking/dtao.js +86 -116
- package/services/earning-service/handlers/native-staking/tanssi.js +2 -1
- package/services/earning-service/handlers/native-staking/tao.d.ts +4 -3
- package/services/earning-service/handlers/native-staking/tao.js +84 -101
- package/services/earning-service/service.d.ts +2 -1
- package/services/earning-service/service.js +37 -6
- package/services/inapp-notification-service/interfaces.d.ts +1 -0
- package/services/multisig-service/index.js +1 -1
- package/services/request-service/handler/SubstrateRequestHandler.d.ts +1 -0
- package/services/request-service/handler/SubstrateRequestHandler.js +12 -0
- package/services/request-service/index.d.ts +1 -0
- package/services/request-service/index.js +3 -0
- package/services/request-service/types.d.ts +1 -0
- package/services/setting-service/constants.js +2 -1
- package/services/storage-service/db-stores/InappNotification.js +1 -1
- package/services/substrate-proxy-service/constant.js +1 -1
- package/services/transaction-service/index.d.ts +1 -1
- package/services/transaction-service/index.js +9 -0
- package/types/balance/transfer.d.ts +2 -0
- package/types/multisig/index.d.ts +12 -0
- package/types/yield/actions/join/submit.d.ts +8 -1
- package/types/yield/info/account/info.d.ts +11 -5
- 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.
|
|
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.
|
|
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:
|
|
32
|
-
defaultUnstake:
|
|
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 =
|
|
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
|
-
|
|
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 {
|
|
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
|
|
248
|
-
const
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
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
|
-
|
|
281
|
-
|
|
282
|
-
const
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
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
|
-
|
|
256
|
+
...nominatorMetadata,
|
|
308
257
|
address: owner,
|
|
309
|
-
|
|
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:
|
|
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
|
|
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
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
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
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
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
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
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
|
-
|
|
339
|
+
...nominatorMetadata,
|
|
383
340
|
address: owner,
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|