@subwallet/extension-base 1.3.51-0 → 1.3.52-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/cjs/constants/environment.js +3 -1
- package/cjs/koni/background/handlers/State.js +1 -5
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/index.js +3 -4
- package/cjs/services/balance-service/transfer/cardano-transfer.js +43 -11
- package/cjs/services/balance-service/transfer/xcm/acrossBridge/index.js +13 -92
- package/cjs/services/balance-service/transfer/xcm/index.js +12 -4
- package/cjs/services/chain-service/utils/patch.js +3 -2
- package/cjs/services/earning-service/handlers/native-staking/dtao.js +28 -301
- package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +4 -4
- package/cjs/services/earning-service/handlers/native-staking/tao.js +174 -148
- package/cjs/services/earning-service/handlers/nomination-pool/index.js +11 -5
- package/cjs/services/earning-service/service.js +5 -2
- package/cjs/services/fee-service/utils/tokenPayFee.js +17 -13
- package/cjs/services/price-service/coingecko.js +3 -3
- package/cjs/services/swap-service/handler/hydradx-handler.js +19 -13
- package/cjs/services/swap-service/index.js +8 -5
- package/cjs/services/transaction-service/utils.js +31 -22
- package/cjs/utils/index.js +12 -0
- package/cjs/utils/setup-api-sdk.js +27 -0
- package/constants/environment.d.ts +1 -0
- package/constants/environment.js +1 -0
- package/koni/background/handlers/State.js +3 -7
- package/package.json +12 -6
- package/packageInfo.js +1 -1
- package/services/balance-service/index.js +3 -4
- package/services/balance-service/transfer/cardano-transfer.js +42 -10
- package/services/balance-service/transfer/xcm/acrossBridge/index.js +14 -93
- package/services/balance-service/transfer/xcm/index.js +12 -4
- package/services/chain-service/utils/patch.d.ts +1 -0
- package/services/chain-service/utils/patch.js +1 -1
- package/services/earning-service/handlers/native-staking/dtao.d.ts +4 -36
- package/services/earning-service/handlers/native-staking/dtao.js +24 -298
- package/services/earning-service/handlers/native-staking/relay-chain.d.ts +1 -2
- package/services/earning-service/handlers/native-staking/relay-chain.js +4 -4
- package/services/earning-service/handlers/native-staking/tao.d.ts +25 -5
- package/services/earning-service/handlers/native-staking/tao.js +169 -149
- package/services/earning-service/handlers/nomination-pool/index.d.ts +1 -2
- package/services/earning-service/handlers/nomination-pool/index.js +11 -5
- package/services/earning-service/service.d.ts +1 -0
- package/services/earning-service/service.js +4 -2
- package/services/fee-service/utils/tokenPayFee.js +17 -13
- package/services/price-service/coingecko.js +2 -3
- package/services/swap-service/handler/hydradx-handler.js +19 -13
- package/services/swap-service/index.js +8 -5
- package/services/transaction-service/utils.d.ts +0 -1
- package/services/transaction-service/utils.js +31 -21
- package/types/swap/index.d.ts +1 -1
- package/types/yield/info/chain/info.d.ts +1 -0
- package/utils/index.d.ts +1 -0
- package/utils/index.js +2 -1
- package/utils/setup-api-sdk.d.ts +1 -0
- package/utils/setup-api-sdk.js +20 -0
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import { _ChainInfo } from '@subwallet/chain-list/types';
|
|
2
|
-
import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
|
|
3
|
-
import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
|
|
4
2
|
import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import BigN from 'bignumber.js';
|
|
3
|
+
import { BaseYieldPositionInfo, RequestEarningSlippage, YieldPoolInfo, YieldPoolType, YieldPositionInfo } from '@subwallet/extension-base/types';
|
|
4
|
+
import TaoNativeStakingPoolHandler, { TaoStakingStakeOption } from './tao';
|
|
8
5
|
export interface SubnetData {
|
|
9
6
|
netuid: number;
|
|
10
7
|
name: string;
|
|
@@ -14,12 +11,6 @@ export interface SubnetData {
|
|
|
14
11
|
taoIn: number;
|
|
15
12
|
taoInEmission: number;
|
|
16
13
|
}
|
|
17
|
-
interface TaoStakingStakeOption {
|
|
18
|
-
owner: string;
|
|
19
|
-
amount: string;
|
|
20
|
-
rate?: BigN;
|
|
21
|
-
identity?: string;
|
|
22
|
-
}
|
|
23
14
|
export interface RawDelegateState {
|
|
24
15
|
data: Array<{
|
|
25
16
|
hotkey_name: string;
|
|
@@ -29,46 +20,23 @@ export interface RawDelegateState {
|
|
|
29
20
|
stake: string;
|
|
30
21
|
}>;
|
|
31
22
|
}
|
|
32
|
-
declare type Nominators = [Array<[number, number]>];
|
|
33
|
-
export interface TestnetBittensorDelegateInfo {
|
|
34
|
-
delegateSs58: string;
|
|
35
|
-
take: number;
|
|
36
|
-
nominators: Nominators;
|
|
37
|
-
returnPer1000: number;
|
|
38
|
-
}
|
|
39
23
|
export interface EarningSlippageResult {
|
|
40
24
|
slippage: number;
|
|
41
25
|
rate: number;
|
|
42
26
|
}
|
|
43
|
-
export
|
|
44
|
-
export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHandler {
|
|
45
|
-
handleYieldWithdraw(address: string, unstakingInfo: UnstakingInfo): Promise<TransactionData>;
|
|
46
|
-
handleYieldCancelUnstake(params: StakeCancelWithdrawalParams): Promise<TransactionData>;
|
|
27
|
+
export default class SubnetTaoStakingPoolHandler extends TaoNativeStakingPoolHandler {
|
|
47
28
|
readonly type = YieldPoolType.SUBNET_STAKING;
|
|
48
29
|
slug: string;
|
|
49
30
|
protected name: string;
|
|
50
31
|
protected shortName: string;
|
|
51
32
|
subnetData: SubnetData[];
|
|
52
33
|
private isInit;
|
|
53
|
-
private bittensorCache;
|
|
54
|
-
readonly availableMethod: YieldPoolMethodInfo;
|
|
55
34
|
constructor(state: KoniState, chain: string);
|
|
56
35
|
canHandleSlug(slug: string): boolean;
|
|
57
36
|
getEarningSlippage(params: RequestEarningSlippage): Promise<EarningSlippageResult>;
|
|
58
|
-
get maintainBalance(): string;
|
|
59
37
|
private init;
|
|
60
38
|
protected getDescription(): string;
|
|
61
39
|
subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
|
|
62
|
-
parseNominatorMetadata(chainInfo: _ChainInfo,
|
|
40
|
+
parseNominatorMetadata(chainInfo: _ChainInfo, delegatorState: TaoStakingStakeOption[], netuid?: number): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
|
|
63
41
|
subscribePoolPosition(useAddresses: string[], rsCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
|
|
64
|
-
checkAccountHaveStake(useAddresses: string[]): Promise<string[]>;
|
|
65
|
-
private getDevnetPoolTargets;
|
|
66
|
-
private getMainnetPoolTargets;
|
|
67
|
-
getPoolTargets(netuid: number): Promise<ValidatorInfo[]>;
|
|
68
|
-
createJoinExtrinsic(data: SubmitJoinNativeStaking, positionInfo?: YieldPositionInfo, bondDest?: string): Promise<[TransactionData, YieldTokenBaseInfo]>;
|
|
69
|
-
validateYieldJoin(data: SubmitJoinNativeStaking, path: OptimalYieldPath): Promise<TransactionError[]>;
|
|
70
|
-
handleYieldUnstake(amount: string, address: string, selectedTarget?: string, netuid?: number, slippage?: number): Promise<[ExtrinsicType, TransactionData]>;
|
|
71
|
-
validateYieldLeave(amount: string, address: string, fastLeave: boolean, selectedTarget?: string, slug?: string, poolInfo?: YieldPoolInfo): Promise<TransactionError[]>;
|
|
72
|
-
handleChangeEarningValidator(data: SubmitBittensorChangeValidatorStaking): Promise<TransactionData>;
|
|
73
42
|
}
|
|
74
|
-
export {};
|
|
@@ -1,20 +1,13 @@
|
|
|
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';
|
|
5
4
|
import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
|
|
6
5
|
import { BITTENSOR_REFRESH_STAKE_APY, BITTENSOR_REFRESH_STAKE_INFO } from '@subwallet/extension-base/constants';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import BaseParaStakingPoolHandler from '@subwallet/extension-base/services/earning-service/handlers/native-staking/base-para';
|
|
10
|
-
import { BasicTxErrorType, EarningStatus, StakingTxErrorType, YieldPoolType } from '@subwallet/extension-base/types';
|
|
11
|
-
import { formatNumber, reformatAddress } from '@subwallet/extension-base/utils';
|
|
6
|
+
import { EarningStatus, YieldPoolType } from '@subwallet/extension-base/types';
|
|
7
|
+
import { reformatAddress } from '@subwallet/extension-base/utils';
|
|
12
8
|
import BigN from 'bignumber.js';
|
|
13
|
-
import { t } from 'i18next';
|
|
14
9
|
import { BN, BN_ZERO } from '@polkadot/util';
|
|
15
|
-
import {
|
|
16
|
-
const DEFAULT_BITTENSOR_SLIPPAGE = 0.005;
|
|
17
|
-
export const DEFAULT_DTAO_MINBOND = '21000000';
|
|
10
|
+
import TaoNativeStakingPoolHandler, { DEFAULT_DTAO_MINBOND } from "./tao.js";
|
|
18
11
|
const getAlphaToTaoMapping = async substrateApi => {
|
|
19
12
|
const allSubnets = (await substrateApi.api.call.subnetInfoRuntimeApi.getAllDynamicInfo()).toJSON();
|
|
20
13
|
if (!allSubnets || allSubnets.length === 0) {
|
|
@@ -32,47 +25,18 @@ const getAlphaToTaoMapping = async substrateApi => {
|
|
|
32
25
|
}
|
|
33
26
|
return result;
|
|
34
27
|
};
|
|
35
|
-
|
|
36
|
-
const subnetInfo = (await substrateApi.api.call.subnetInfoRuntimeApi.getDynamicInfo(netuid)).toJSON();
|
|
37
|
-
if (!subnetInfo) {
|
|
38
|
-
return '1';
|
|
39
|
-
}
|
|
40
|
-
const taoIn = subnetInfo.taoIn ? new BigN(subnetInfo.taoIn) : new BigN(0);
|
|
41
|
-
const alphaIn = subnetInfo.alphaIn ? new BigN(subnetInfo.alphaIn) : new BigN(0);
|
|
42
|
-
return netuid === 0 || alphaIn.lte(0) ? '1' : taoIn.dividedBy(alphaIn).toString();
|
|
43
|
-
};
|
|
44
|
-
export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHandler {
|
|
45
|
-
/* Unimplemented function */
|
|
46
|
-
handleYieldWithdraw(address, unstakingInfo) {
|
|
47
|
-
throw new Error('Method not implemented.');
|
|
48
|
-
}
|
|
49
|
-
handleYieldCancelUnstake(params) {
|
|
50
|
-
throw new Error('Method not implemented.');
|
|
51
|
-
}
|
|
52
|
-
/* Unimplemented function */
|
|
53
|
-
|
|
28
|
+
export default class SubnetTaoStakingPoolHandler extends TaoNativeStakingPoolHandler {
|
|
54
29
|
// @ts-ignore
|
|
55
30
|
type = YieldPoolType.SUBNET_STAKING;
|
|
56
31
|
subnetData = [];
|
|
57
32
|
isInit = false;
|
|
58
|
-
availableMethod = {
|
|
59
|
-
join: true,
|
|
60
|
-
defaultUnstake: true,
|
|
61
|
-
fastUnstake: false,
|
|
62
|
-
cancelUnstake: false,
|
|
63
|
-
withdraw: false,
|
|
64
|
-
claimReward: false,
|
|
65
|
-
changeValidator: true
|
|
66
|
-
};
|
|
67
33
|
constructor(state, chain) {
|
|
68
34
|
super(state, chain);
|
|
69
|
-
const
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
this.slug = this.slug = `${symbol}___subnet_staking___${_chainInfo.slug}`;
|
|
35
|
+
const symbol = this.nativeToken.symbol;
|
|
36
|
+
const chainSlug = this.chainInfo.slug;
|
|
37
|
+
this.slug = `${symbol}___subnet_staking___${chainSlug}`;
|
|
73
38
|
this.name = 'Subnet Tao Staking';
|
|
74
39
|
this.shortName = 'dTAO Staking';
|
|
75
|
-
this.bittensorCache = BittensorCache.getInstance();
|
|
76
40
|
}
|
|
77
41
|
canHandleSlug(slug) {
|
|
78
42
|
return slug.startsWith(`${this.slug}__`);
|
|
@@ -111,15 +75,9 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
|
|
|
111
75
|
rate: 1
|
|
112
76
|
};
|
|
113
77
|
}
|
|
114
|
-
|
|
115
|
-
const ed = new BigN(this.nativeToken.minAmount || '0');
|
|
116
|
-
const calculateMaintainBalance = new BigN(15).multipliedBy(ed).dividedBy(10);
|
|
117
|
-
const maintainBalance = calculateMaintainBalance;
|
|
118
|
-
return maintainBalance.toString();
|
|
119
|
-
}
|
|
120
|
-
async init() {
|
|
78
|
+
async init(forceRefresh = false) {
|
|
121
79
|
try {
|
|
122
|
-
if (this.isInit || !this.substrateApi) {
|
|
80
|
+
if (this.isInit && !forceRefresh || !this.substrateApi) {
|
|
123
81
|
return;
|
|
124
82
|
}
|
|
125
83
|
const substrateApi = await this.substrateApi.isReady;
|
|
@@ -159,20 +117,20 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
|
|
|
159
117
|
/* Subscribe pool info */
|
|
160
118
|
|
|
161
119
|
async subscribePoolInfo(callback) {
|
|
162
|
-
await this.
|
|
120
|
+
await this.substrateApi.isReady;
|
|
163
121
|
let cancel = false;
|
|
164
122
|
const updateStakingInfo = async () => {
|
|
165
|
-
await this.
|
|
123
|
+
await this.init(true);
|
|
124
|
+
if (cancel) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
166
127
|
try {
|
|
167
|
-
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
this.subnetData.forEach(subnet => {
|
|
128
|
+
for (const subnet of this.subnetData) {
|
|
171
129
|
const netuid = subnet.netuid.toString().padStart(2, '0');
|
|
172
|
-
const subnetSlug = `${this.slug}__subnet_${netuid
|
|
130
|
+
const subnetSlug = `${this.slug}__subnet_${netuid}`;
|
|
173
131
|
const subnetName = `${subnet.name || 'Unknown'} ${netuid}`;
|
|
174
132
|
const bnTaoIn = new BigN(subnet.taoIn);
|
|
175
|
-
const emission = new BigN(subnet.taoInEmission).dividedBy(new BigN(10).pow(
|
|
133
|
+
const emission = new BigN(subnet.taoInEmission).dividedBy(new BigN(10).pow(7));
|
|
176
134
|
const data = {
|
|
177
135
|
...this.baseInfo,
|
|
178
136
|
type: this.type,
|
|
@@ -185,7 +143,8 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
|
|
|
185
143
|
subnetData: {
|
|
186
144
|
netuid: subnet.netuid,
|
|
187
145
|
subnetSymbol: subnet.symbol || 'dTAO'
|
|
188
|
-
}
|
|
146
|
+
},
|
|
147
|
+
minValidate: DEFAULT_DTAO_MINBOND
|
|
189
148
|
},
|
|
190
149
|
statistic: {
|
|
191
150
|
assetEarning: [{
|
|
@@ -206,7 +165,7 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
|
|
|
206
165
|
}
|
|
207
166
|
};
|
|
208
167
|
callback(data);
|
|
209
|
-
}
|
|
168
|
+
}
|
|
210
169
|
} catch (error) {
|
|
211
170
|
console.error('Error updating staking info:', error);
|
|
212
171
|
}
|
|
@@ -224,39 +183,9 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
|
|
|
224
183
|
|
|
225
184
|
/* Subscribe pool position */
|
|
226
185
|
|
|
227
|
-
async parseNominatorMetadata(chainInfo,
|
|
228
|
-
await this.
|
|
229
|
-
|
|
230
|
-
let allActiveStake = BN_ZERO;
|
|
231
|
-
for (const delegate of delegatorState) {
|
|
232
|
-
const stake = new BigN(delegate.amount);
|
|
233
|
-
const originActiveStake = stake.multipliedBy(delegate.rate || new BigN(1)).toFixed(0).toString();
|
|
234
|
-
const bnActiveStake = new BN(originActiveStake);
|
|
235
|
-
if (bnActiveStake.gt(BN_ZERO)) {
|
|
236
|
-
const delegationStatus = EarningStatus.EARNING_REWARD;
|
|
237
|
-
allActiveStake = allActiveStake.add(bnActiveStake);
|
|
238
|
-
nominationList.push({
|
|
239
|
-
status: delegationStatus,
|
|
240
|
-
chain: chainInfo.slug,
|
|
241
|
-
validatorAddress: delegate.owner,
|
|
242
|
-
activeStake: delegate.amount,
|
|
243
|
-
validatorMinStake: DEFAULT_DTAO_MINBOND,
|
|
244
|
-
originActiveStake: originActiveStake,
|
|
245
|
-
validatorIdentity: delegate.identity
|
|
246
|
-
});
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
const stakingStatus = getEarningStatusByNominations(allActiveStake, nominationList);
|
|
250
|
-
return {
|
|
251
|
-
status: stakingStatus,
|
|
252
|
-
balanceToken: this.nativeToken.slug,
|
|
253
|
-
totalStake: allActiveStake.toString(),
|
|
254
|
-
activeStake: allActiveStake.toString(),
|
|
255
|
-
unstakeBalance: '0',
|
|
256
|
-
isBondedBefore: true,
|
|
257
|
-
nominations: nominationList,
|
|
258
|
-
unstakings: []
|
|
259
|
-
};
|
|
186
|
+
async parseNominatorMetadata(chainInfo, delegatorState, netuid) {
|
|
187
|
+
const bnMinBond = await this.getMinBond(netuid);
|
|
188
|
+
return this.parseNominatorMetadataBase(chainInfo, delegatorState, bnMinBond.toString(), true);
|
|
260
189
|
}
|
|
261
190
|
async subscribePoolPosition(useAddresses, rsCallback) {
|
|
262
191
|
await this.init();
|
|
@@ -309,7 +238,7 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
|
|
|
309
238
|
originalTotalStake = BN_ZERO
|
|
310
239
|
} = subnetPositions[netuid] || {};
|
|
311
240
|
if (delegatorState.length > 0) {
|
|
312
|
-
this.parseNominatorMetadata(chainInfo,
|
|
241
|
+
this.parseNominatorMetadata(chainInfo, delegatorState, netuid).then(nominatorMetadata => {
|
|
313
242
|
rsCallback({
|
|
314
243
|
...defaultInfo,
|
|
315
244
|
...nominatorMetadata,
|
|
@@ -364,208 +293,5 @@ export default class SubnetTaoStakingPoolHandler extends BaseParaStakingPoolHand
|
|
|
364
293
|
};
|
|
365
294
|
}
|
|
366
295
|
|
|
367
|
-
// Because not have subscan api
|
|
368
|
-
async checkAccountHaveStake(useAddresses) {
|
|
369
|
-
return Promise.resolve([]);
|
|
370
|
-
}
|
|
371
|
-
|
|
372
296
|
/* Subscribe pool position */
|
|
373
|
-
|
|
374
|
-
/* Get pool targets */
|
|
375
|
-
// eslint-disable-next-line @typescript-eslint/require-await
|
|
376
|
-
async getDevnetPoolTargets() {
|
|
377
|
-
const testnetDelegate = (await this.substrateApi.api.call.delegateInfoRuntimeApi.getDelegates()).toJSON();
|
|
378
|
-
const bnMinBond = new BigN(DEFAULT_DTAO_MINBOND);
|
|
379
|
-
const filteredDelegates = testnetDelegate.filter(delegate => {
|
|
380
|
-
return delegate.returnPer1000 !== 0;
|
|
381
|
-
});
|
|
382
|
-
return filteredDelegates.map(delegate => ({
|
|
383
|
-
address: delegate.delegateSs58,
|
|
384
|
-
totalStake: '0',
|
|
385
|
-
ownStake: '0',
|
|
386
|
-
otherStake: '0',
|
|
387
|
-
minBond: bnMinBond.toString(),
|
|
388
|
-
nominatorCount: delegate.nominators.length,
|
|
389
|
-
commission: delegate.take / 1000,
|
|
390
|
-
blocked: false,
|
|
391
|
-
isVerified: false,
|
|
392
|
-
chain: this.chain,
|
|
393
|
-
isCrowded: false
|
|
394
|
-
}));
|
|
395
|
-
}
|
|
396
|
-
async getMainnetPoolTargets(netuid) {
|
|
397
|
-
const _topValidator = await this.bittensorCache.get();
|
|
398
|
-
const topValidator = _topValidator;
|
|
399
|
-
const bnMinBond = new BigN(DEFAULT_DTAO_MINBOND);
|
|
400
|
-
const validatorList = topValidator.data;
|
|
401
|
-
const aprResponse = await this.bittensorCache.fetchApr(netuid);
|
|
402
|
-
const aprMap = {};
|
|
403
|
-
aprResponse.data.forEach(item => {
|
|
404
|
-
aprMap[item.hotkey.ss58] = item.thirty_day_apy;
|
|
405
|
-
});
|
|
406
|
-
const results = await Promise.all(validatorList.map(validator => {
|
|
407
|
-
const address = validator.hotkey.ss58;
|
|
408
|
-
// With bittensor we use total weight, root weight and alpha staked insted of total stake, own stake and other stake
|
|
409
|
-
const bnTotalWeightStake = new BigN(validator.global_weighted_stake);
|
|
410
|
-
const bnRootWeightStake = new BigN(validator.weighted_root_stake);
|
|
411
|
-
const bnAlphaStake = new BigN(validator.global_alpha_stake_as_tao);
|
|
412
|
-
const nominatorCount = validator.global_nominators;
|
|
413
|
-
const commission = validator.take;
|
|
414
|
-
const roundedCommission = (parseFloat(commission) * 100).toFixed(0);
|
|
415
|
-
const apr = aprMap[address];
|
|
416
|
-
const expectedReturn = apr ? new BigN(apr).multipliedBy(100).toFixed(2) : '0';
|
|
417
|
-
const name = validator.name || address;
|
|
418
|
-
return {
|
|
419
|
-
address: address,
|
|
420
|
-
totalStake: bnTotalWeightStake.toString(),
|
|
421
|
-
ownStake: bnRootWeightStake.toString(),
|
|
422
|
-
otherStake: bnAlphaStake.toString(),
|
|
423
|
-
minBond: bnMinBond.toString(),
|
|
424
|
-
nominatorCount: nominatorCount,
|
|
425
|
-
commission: roundedCommission,
|
|
426
|
-
expectedReturn: expectedReturn,
|
|
427
|
-
blocked: false,
|
|
428
|
-
isVerified: false,
|
|
429
|
-
chain: this.chain,
|
|
430
|
-
isCrowded: false,
|
|
431
|
-
identity: name
|
|
432
|
-
};
|
|
433
|
-
}));
|
|
434
|
-
return results;
|
|
435
|
-
}
|
|
436
|
-
async getPoolTargets(netuid) {
|
|
437
|
-
await this.init();
|
|
438
|
-
if (this.chain === 'bittensor') {
|
|
439
|
-
return this.getMainnetPoolTargets(netuid);
|
|
440
|
-
} else {
|
|
441
|
-
return this.getDevnetPoolTargets();
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
/* Get pool targets */
|
|
446
|
-
|
|
447
|
-
/* Join pool action */
|
|
448
|
-
|
|
449
|
-
async createJoinExtrinsic(data, positionInfo, bondDest = 'Staked') {
|
|
450
|
-
const {
|
|
451
|
-
amount,
|
|
452
|
-
selectedValidators: targetValidators,
|
|
453
|
-
subnetData
|
|
454
|
-
} = data;
|
|
455
|
-
if (!subnetData) {
|
|
456
|
-
throw new Error(BasicTxErrorType.INVALID_PARAMS);
|
|
457
|
-
}
|
|
458
|
-
const {
|
|
459
|
-
netuid,
|
|
460
|
-
slippage
|
|
461
|
-
} = subnetData;
|
|
462
|
-
const chainApi = await this.substrateApi.isReady;
|
|
463
|
-
const binaryAmount = new BigN(amount);
|
|
464
|
-
const alphaToTaoPrice = new BigN(await getAlphaToTaoRate(this.substrateApi, netuid));
|
|
465
|
-
const limitPrice = alphaToTaoPrice.multipliedBy(10 ** _getAssetDecimals(this.nativeToken)).multipliedBy(1 + (slippage || DEFAULT_BITTENSOR_SLIPPAGE));
|
|
466
|
-
const BNlimitPrice = new BigN(limitPrice.integerValue(BigN.ROUND_CEIL).toFixed());
|
|
467
|
-
|
|
468
|
-
// Bittensor only supports changing 1 validator at a time, not multiple
|
|
469
|
-
const selectedValidatorInfo = targetValidators[0];
|
|
470
|
-
const hotkey = selectedValidatorInfo.address;
|
|
471
|
-
const extrinsic = chainApi.api.tx.subtensorModule.addStakeLimit(hotkey, netuid, binaryAmount.toFixed(), BNlimitPrice.toFixed(), false);
|
|
472
|
-
return [extrinsic, {
|
|
473
|
-
slug: this.nativeToken.slug,
|
|
474
|
-
amount: '0'
|
|
475
|
-
}];
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
// Validate for case stake more
|
|
479
|
-
async validateYieldJoin(data, path) {
|
|
480
|
-
const baseErrors = await super.validateYieldJoin(data, path);
|
|
481
|
-
if (baseErrors.length > 0) {
|
|
482
|
-
return baseErrors;
|
|
483
|
-
}
|
|
484
|
-
const {
|
|
485
|
-
amount
|
|
486
|
-
} = data;
|
|
487
|
-
if (new BigN(amount).lt(new BigN(DEFAULT_DTAO_MINBOND))) {
|
|
488
|
-
return [new TransactionError(BasicTxErrorType.INVALID_PARAMS, t(`Insufficient stake. You need to stake at least ${formatNumber(DEFAULT_DTAO_MINBOND, _getAssetDecimals(this.nativeToken))} ${_getAssetSymbol(this.nativeToken)} to earn rewards`))];
|
|
489
|
-
}
|
|
490
|
-
return baseErrors;
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
/* Join pool action */
|
|
494
|
-
|
|
495
|
-
/* Leave pool action */
|
|
496
|
-
|
|
497
|
-
async handleYieldUnstake(amount, address, selectedTarget, netuid, slippage) {
|
|
498
|
-
const apiPromise = await this.substrateApi.isReady;
|
|
499
|
-
if (!selectedTarget) {
|
|
500
|
-
return Promise.reject(new TransactionError(BasicTxErrorType.INVALID_PARAMS));
|
|
501
|
-
}
|
|
502
|
-
const binaryAmount = new BigN(amount);
|
|
503
|
-
const alphaToTaoPrice = new BigN(await getAlphaToTaoRate(this.substrateApi, netuid || 0));
|
|
504
|
-
const limitPrice = alphaToTaoPrice.multipliedBy(10 ** _getAssetDecimals(this.nativeToken)).multipliedBy(1 - (slippage || DEFAULT_BITTENSOR_SLIPPAGE));
|
|
505
|
-
const BNlimitPrice = new BigN(limitPrice.integerValue(BigN.ROUND_CEIL).toFixed());
|
|
506
|
-
const extrinsic = apiPromise.api.tx.subtensorModule.removeStakeLimit(selectedTarget, netuid, binaryAmount.toFixed(), BNlimitPrice.toFixed(), false);
|
|
507
|
-
return [ExtrinsicType.STAKING_UNBOND, extrinsic];
|
|
508
|
-
}
|
|
509
|
-
async validateYieldLeave(amount, address, fastLeave, selectedTarget, slug, poolInfo) {
|
|
510
|
-
var _poolInfo$metadata$su;
|
|
511
|
-
const baseErrors = await super.validateYieldLeave(amount, address, fastLeave, selectedTarget, slug);
|
|
512
|
-
if (baseErrors.length > 0) {
|
|
513
|
-
return baseErrors;
|
|
514
|
-
}
|
|
515
|
-
if (!poolInfo) {
|
|
516
|
-
return [new TransactionError(BasicTxErrorType.INVALID_PARAMS)];
|
|
517
|
-
}
|
|
518
|
-
const netuid = (_poolInfo$metadata$su = poolInfo.metadata.subnetData) === null || _poolInfo$metadata$su === void 0 ? void 0 : _poolInfo$metadata$su.netuid;
|
|
519
|
-
const alphaToTaoPrice = new BigN(await getAlphaToTaoRate(this.substrateApi, netuid || 0));
|
|
520
|
-
const minUnstake = new BigN(DEFAULT_DTAO_MINBOND).dividedBy(alphaToTaoPrice);
|
|
521
|
-
const formattedMinUnstake = minUnstake.dividedBy(1000000).integerValue(BigN.ROUND_CEIL).dividedBy(1000);
|
|
522
|
-
if (new BigN(amount).lt(formattedMinUnstake.multipliedBy(10 ** _getAssetDecimals(this.nativeToken)))) {
|
|
523
|
-
var _poolInfo$metadata$su2;
|
|
524
|
-
return [new TransactionError(BasicTxErrorType.INVALID_PARAMS, t(`Amount too low. You need to unstake at least ${formattedMinUnstake.toString()} ${((_poolInfo$metadata$su2 = poolInfo.metadata.subnetData) === null || _poolInfo$metadata$su2 === void 0 ? void 0 : _poolInfo$metadata$su2.subnetSymbol) || ''}`))];
|
|
525
|
-
}
|
|
526
|
-
return baseErrors;
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
/* Leave pool action */
|
|
530
|
-
|
|
531
|
-
/* Change validator */
|
|
532
|
-
async handleChangeEarningValidator(data) {
|
|
533
|
-
const chainApi = await this.substrateApi.isReady;
|
|
534
|
-
const {
|
|
535
|
-
amount,
|
|
536
|
-
maxAmount,
|
|
537
|
-
metadata,
|
|
538
|
-
originValidator,
|
|
539
|
-
selectedValidators: targetValidators,
|
|
540
|
-
subnetData
|
|
541
|
-
} = data;
|
|
542
|
-
if (!subnetData || !originValidator) {
|
|
543
|
-
return Promise.reject(new TransactionError(BasicTxErrorType.INVALID_PARAMS));
|
|
544
|
-
}
|
|
545
|
-
const {
|
|
546
|
-
netuid
|
|
547
|
-
} = subnetData;
|
|
548
|
-
const selectedValidatorInfo = targetValidators[0];
|
|
549
|
-
const destValidator = selectedValidatorInfo.address;
|
|
550
|
-
if (new BigN(amount).lte(0)) {
|
|
551
|
-
return Promise.reject(new TransactionError(BasicTxErrorType.INVALID_PARAMS, t('Amount must be greater than 0')));
|
|
552
|
-
}
|
|
553
|
-
if (originValidator === destValidator) {
|
|
554
|
-
return Promise.reject(new TransactionError(BasicTxErrorType.INVALID_PARAMS, 'From validator is the same with to validator'));
|
|
555
|
-
}
|
|
556
|
-
const alphaToTaoPrice = new BigN(await getAlphaToTaoRate(this.substrateApi, netuid || 0));
|
|
557
|
-
const minUnstake = new BigN(DEFAULT_DTAO_MINBOND).dividedBy(alphaToTaoPrice);
|
|
558
|
-
const formattedMinUnstake = minUnstake.dividedBy(1000000).integerValue(BigN.ROUND_CEIL).dividedBy(1000);
|
|
559
|
-
const bnMinUnstake = formattedMinUnstake.multipliedBy(10 ** _getAssetDecimals(this.nativeToken));
|
|
560
|
-
if (new BigN(maxAmount).lt(bnMinUnstake)) {
|
|
561
|
-
return Promise.reject(new TransactionError(BasicTxErrorType.INVALID_PARAMS, t(`Amount too low. You need to move at least ${formattedMinUnstake.toString()} ${(metadata === null || metadata === void 0 ? void 0 : metadata.subnetSymbol) || ''}`)));
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
// Avoid remaining amount too low -> can't do anything with that amount
|
|
565
|
-
if (!(maxAmount === amount) && new BigN(maxAmount).minus(new BigN(amount)).lt(bnMinUnstake)) {
|
|
566
|
-
return Promise.reject(new TransactionError(StakingTxErrorType.REMAINING_AMOUNT_TOO_LOW, 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 ${formatNumber(maxAmount, _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`)));
|
|
567
|
-
}
|
|
568
|
-
const extrinsic = chainApi.api.tx.subtensorModule.moveStake(originValidator, destValidator, netuid, netuid, amount);
|
|
569
|
-
return extrinsic;
|
|
570
|
-
}
|
|
571
297
|
}
|
|
@@ -5,14 +5,13 @@ import { ExtrinsicType, NominationInfo, UnstakingInfo } from '@subwallet/extensi
|
|
|
5
5
|
import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
|
|
6
6
|
import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
|
|
7
7
|
import { BaseYieldPositionInfo, OptimalYieldPath, PalletStakingNominations, PalletStakingStakingLedger, StakeCancelWithdrawalParams, SubmitChangeValidatorStaking, SubmitJoinNativeStaking, SubmitYieldJoinData, TransactionData, ValidatorInfo, YieldPoolInfo, YieldPoolMethodInfo, YieldPositionInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
|
|
8
|
-
import { DeriveSessionProgress } from '@polkadot/api-derive/types';
|
|
9
8
|
import { BN } from '@polkadot/util';
|
|
10
9
|
import BaseNativeStakingPoolHandler from './base';
|
|
11
10
|
export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPoolHandler {
|
|
12
11
|
availableMethod: YieldPoolMethodInfo;
|
|
13
12
|
constructor(state: KoniState, chain: string);
|
|
14
13
|
subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
|
|
15
|
-
parseNominatorMetadata(chainInfo: _ChainInfo, address: string, substrateApi: _SubstrateApi, ledger: PalletStakingStakingLedger, currentEra: string, minStake: BN
|
|
14
|
+
parseNominatorMetadata(chainInfo: _ChainInfo, address: string, substrateApi: _SubstrateApi, ledger: PalletStakingStakingLedger, currentEra: string, minStake: BN): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
|
|
16
15
|
handleNominationsList(substrateApi: _SubstrateApi, chain: string, nominations: PalletStakingNominations, currentEra: string, address: string, maxNominatorRewardedPerValidator: number | undefined): Promise<NominationInfo[]>;
|
|
17
16
|
subscribePoolPosition(useAddresses: string[], resultCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
|
|
18
17
|
checkAccountHaveStake(useAddresses: string[]): Promise<string[]>;
|
|
@@ -142,7 +142,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
142
142
|
|
|
143
143
|
/* Subscribe pool position */
|
|
144
144
|
|
|
145
|
-
async parseNominatorMetadata(chainInfo, address, substrateApi, ledger, currentEra, minStake
|
|
145
|
+
async parseNominatorMetadata(chainInfo, address, substrateApi, ledger, currentEra, minStake) {
|
|
146
146
|
var _substrateApi$api$que7, _substrateApi$api$que8, _substrateApi$api$que9, _substrateApi$api$que10, _substrateApi$api$que11, _substrateApi$api$que12;
|
|
147
147
|
const chain = chainInfo.slug;
|
|
148
148
|
const [_nominations, _bonded, _activeEra] = await Promise.all([(_substrateApi$api$que7 = substrateApi.api.query) === null || _substrateApi$api$que7 === void 0 ? void 0 : (_substrateApi$api$que8 = _substrateApi$api$que7.staking) === null || _substrateApi$api$que8 === void 0 ? void 0 : _substrateApi$api$que8.nominators(address), (_substrateApi$api$que9 = substrateApi.api.query) === null || _substrateApi$api$que9 === void 0 ? void 0 : (_substrateApi$api$que10 = _substrateApi$api$que9.staking) === null || _substrateApi$api$que10 === void 0 ? void 0 : _substrateApi$api$que10.bonded(address), (_substrateApi$api$que11 = substrateApi.api.query) === null || _substrateApi$api$que11 === void 0 ? void 0 : (_substrateApi$api$que12 = _substrateApi$api$que11.staking) === null || _substrateApi$api$que12 === void 0 ? void 0 : _substrateApi$api$que12.activeEra()]);
|
|
@@ -261,7 +261,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
261
261
|
}
|
|
262
262
|
if (ledgers) {
|
|
263
263
|
var _substrateApi$api$que14, _substrateApi$api$que15, _substrateApi$api$que16, _substrateApi$api$que17, _substrateApi$api$que18, _substrateApi$api$que19, _substrateApi$api$que20, _substrateApi$api$que21, _substrateApi$api$der, _substrateApi$api$der2;
|
|
264
|
-
const [_currentEra, _minimumActiveStake, _minNominatorBond
|
|
264
|
+
const [_currentEra, _minimumActiveStake, _minNominatorBond] = await Promise.all([(_substrateApi$api$que14 = substrateApi.api.query) === null || _substrateApi$api$que14 === void 0 ? void 0 : (_substrateApi$api$que15 = _substrateApi$api$que14.staking) === null || _substrateApi$api$que15 === void 0 ? void 0 : _substrateApi$api$que15.currentEra(), ((_substrateApi$api$que16 = substrateApi.api.query) === null || _substrateApi$api$que16 === void 0 ? void 0 : (_substrateApi$api$que17 = _substrateApi$api$que16.staking) === null || _substrateApi$api$que17 === void 0 ? void 0 : _substrateApi$api$que17.minimumActiveStake) && ((_substrateApi$api$que18 = substrateApi.api.query) === null || _substrateApi$api$que18 === void 0 ? void 0 : (_substrateApi$api$que19 = _substrateApi$api$que18.staking) === null || _substrateApi$api$que19 === void 0 ? void 0 : _substrateApi$api$que19.minimumActiveStake()), (_substrateApi$api$que20 = substrateApi.api.query) === null || _substrateApi$api$que20 === void 0 ? void 0 : (_substrateApi$api$que21 = _substrateApi$api$que20.staking) === null || _substrateApi$api$que21 === void 0 ? void 0 : _substrateApi$api$que21.minNominatorBond(), (_substrateApi$api$der = substrateApi.api.derive) === null || _substrateApi$api$der === void 0 ? void 0 : (_substrateApi$api$der2 = _substrateApi$api$der.session) === null || _substrateApi$api$der2 === void 0 ? void 0 : _substrateApi$api$der2.progress()]);
|
|
265
265
|
const currentEra = _currentEra.toString();
|
|
266
266
|
const minActiveStake = (_minimumActiveStake === null || _minimumActiveStake === void 0 ? void 0 : _minimumActiveStake.toString()) || '0';
|
|
267
267
|
const minNominatorBond = _minNominatorBond.toString();
|
|
@@ -272,7 +272,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
272
272
|
const owner = reformatAddress(useAddresses[i], 42);
|
|
273
273
|
const ledger = _ledger.toPrimitive();
|
|
274
274
|
if (ledger) {
|
|
275
|
-
const nominatorMetadata = await this.parseNominatorMetadata(chainInfo, owner, substrateApi, ledger, currentEra, minStake
|
|
275
|
+
const nominatorMetadata = await this.parseNominatorMetadata(chainInfo, owner, substrateApi, ledger, currentEra, minStake);
|
|
276
276
|
resultCallback({
|
|
277
277
|
...defaultInfo,
|
|
278
278
|
...nominatorMetadata,
|
|
@@ -311,7 +311,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
311
311
|
for (let i = 0; i < useAddresses.length; i++) {
|
|
312
312
|
const address = useAddresses[i];
|
|
313
313
|
const _ledger = ledgers[i].toPrimitive();
|
|
314
|
-
if (_ledger.total > 0) {
|
|
314
|
+
if (_ledger && _ledger.total > 0) {
|
|
315
315
|
result.push(address);
|
|
316
316
|
}
|
|
317
317
|
}
|
|
@@ -2,16 +2,26 @@ import { _ChainInfo } from '@subwallet/chain-list/types';
|
|
|
2
2
|
import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
|
|
3
3
|
import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
|
|
4
4
|
import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
|
|
5
|
+
import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
|
|
5
6
|
import BaseParaStakingPoolHandler from '@subwallet/extension-base/services/earning-service/handlers/native-staking/base-para';
|
|
6
7
|
import { BaseYieldPositionInfo, OptimalYieldPath, StakeCancelWithdrawalParams, SubmitBittensorChangeValidatorStaking, SubmitJoinNativeStaking, TransactionData, UnstakingInfo, ValidatorInfo, YieldPoolInfo, YieldPoolMethodInfo, YieldPositionInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
|
|
8
|
+
import BigN from 'bignumber.js';
|
|
9
|
+
declare type Nominators = [Array<[number, number]>];
|
|
10
|
+
export interface TestnetBittensorDelegateInfo {
|
|
11
|
+
delegateSs58: string;
|
|
12
|
+
take: number;
|
|
13
|
+
nominators: Nominators;
|
|
14
|
+
returnPer1000: number;
|
|
15
|
+
}
|
|
7
16
|
export interface TaoStakeInfo {
|
|
8
17
|
hotkey: string;
|
|
9
18
|
stake: string;
|
|
10
19
|
netuid: number;
|
|
11
20
|
}
|
|
12
|
-
interface TaoStakingStakeOption {
|
|
21
|
+
export interface TaoStakingStakeOption {
|
|
13
22
|
owner: string;
|
|
14
23
|
amount: string;
|
|
24
|
+
rate?: BigN;
|
|
15
25
|
identity?: string;
|
|
16
26
|
}
|
|
17
27
|
export interface RawDelegateState {
|
|
@@ -53,6 +63,13 @@ interface ValidatorApr {
|
|
|
53
63
|
netuid: number;
|
|
54
64
|
thirty_day_apy: string;
|
|
55
65
|
}
|
|
66
|
+
export interface RateSubnetData {
|
|
67
|
+
netuid: number;
|
|
68
|
+
taoIn: string;
|
|
69
|
+
alphaIn: string;
|
|
70
|
+
alphaOut: string;
|
|
71
|
+
}
|
|
72
|
+
export declare const DEFAULT_DTAO_MINBOND = "21000000";
|
|
56
73
|
export declare class BittensorCache {
|
|
57
74
|
private static instance;
|
|
58
75
|
private cache;
|
|
@@ -64,23 +81,26 @@ export declare class BittensorCache {
|
|
|
64
81
|
private fetchData;
|
|
65
82
|
fetchApr(netuid: number): Promise<ValidatorAprResponse>;
|
|
66
83
|
}
|
|
84
|
+
export declare const getAlphaToTaoRate: (substrateApi: _SubstrateApi, netuid: number) => Promise<string>;
|
|
67
85
|
export default class TaoNativeStakingPoolHandler extends BaseParaStakingPoolHandler {
|
|
68
86
|
readonly availableMethod: YieldPoolMethodInfo;
|
|
69
|
-
|
|
87
|
+
protected bittensorCache: BittensorCache;
|
|
88
|
+
protected getMinBond(netuid?: number): Promise<BigN>;
|
|
70
89
|
constructor(state: KoniState, chain: string);
|
|
71
90
|
handleYieldWithdraw(address: string, unstakingInfo: UnstakingInfo): Promise<TransactionData>;
|
|
72
91
|
handleYieldCancelUnstake(params: StakeCancelWithdrawalParams): Promise<TransactionData>;
|
|
73
92
|
get maintainBalance(): string;
|
|
74
93
|
subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
|
|
75
|
-
|
|
94
|
+
protected parseNominatorMetadataBase(chainInfo: _ChainInfo, delegatorState: TaoStakingStakeOption[], minBond: string, applyRate?: boolean): Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>;
|
|
95
|
+
parseNominatorMetadata(chainInfo: _ChainInfo, delegatorState: TaoStakingStakeOption[]): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
|
|
76
96
|
subscribePoolPosition(useAddresses: string[], rsCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
|
|
77
97
|
checkAccountHaveStake(useAddresses: string[]): Promise<string[]>;
|
|
78
98
|
private getDevnetPoolTargets;
|
|
79
99
|
private getMainnetPoolTargets;
|
|
80
|
-
getPoolTargets(): Promise<ValidatorInfo[]>;
|
|
100
|
+
getPoolTargets(netuid?: number): Promise<ValidatorInfo[]>;
|
|
81
101
|
createJoinExtrinsic(data: SubmitJoinNativeStaking, positionInfo?: YieldPositionInfo, bondDest?: string): Promise<[TransactionData, YieldTokenBaseInfo]>;
|
|
82
102
|
validateYieldJoin(data: SubmitJoinNativeStaking, path: OptimalYieldPath): Promise<TransactionError[]>;
|
|
83
|
-
handleYieldUnstake(amount: string, address: string, selectedTarget?: string): Promise<[ExtrinsicType, TransactionData]>;
|
|
103
|
+
handleYieldUnstake(amount: string, address: string, selectedTarget?: string, netuid?: number, slippage?: number): Promise<[ExtrinsicType, TransactionData]>;
|
|
84
104
|
validateYieldLeave(amount: string, address: string, fastLeave: boolean, selectedTarget?: string, slug?: string, poolInfo?: YieldPoolInfo): Promise<TransactionError[]>;
|
|
85
105
|
handleChangeEarningValidator(data: SubmitBittensorChangeValidatorStaking): Promise<TransactionData>;
|
|
86
106
|
}
|