@subwallet/extension-base 1.3.46-0 → 1.3.48-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/background/KoniTypes.d.ts +7 -1
- package/background/KoniTypes.js +1 -0
- package/background/errors/TransactionError.js +4 -0
- package/cjs/background/KoniTypes.js +1 -0
- package/cjs/background/errors/TransactionError.js +4 -0
- package/cjs/core/logic-validation/transfer.js +7 -0
- package/cjs/koni/api/nft/config.js +1 -1
- package/cjs/koni/api/nft/ordinal_nft/index.js +3 -2
- package/cjs/koni/background/handlers/Extension.js +21 -1
- package/cjs/koni/background/handlers/State.js +3 -0
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +8 -14
- package/cjs/services/buy-service/index.js +2 -0
- package/cjs/services/chain-service/index.js +7 -2
- package/cjs/services/chain-service/utils/index.js +3 -0
- package/cjs/services/chain-service/utils/patch.js +1 -1
- package/cjs/services/earning-service/constants/chains.js +4 -2
- package/cjs/services/earning-service/handlers/lending/interlay.js +2 -1
- package/cjs/services/earning-service/handlers/liquid-staking/acala.js +2 -1
- package/cjs/services/earning-service/handlers/liquid-staking/bifrost.js +2 -1
- package/cjs/services/earning-service/handlers/liquid-staking/parallel.js +2 -1
- package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +2 -1
- package/cjs/services/earning-service/handlers/native-staking/amplitude.js +32 -0
- package/cjs/services/earning-service/handlers/native-staking/astar.js +20 -1
- package/cjs/services/earning-service/handlers/native-staking/base.js +42 -30
- package/cjs/services/earning-service/handlers/native-staking/dtao.js +79 -21
- package/cjs/services/earning-service/handlers/native-staking/mythos.js +30 -1
- package/cjs/services/earning-service/handlers/native-staking/para-chain.js +17 -0
- package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +49 -6
- package/cjs/services/earning-service/handlers/native-staking/tao.js +98 -32
- package/cjs/services/earning-service/handlers/nomination-pool/index.js +5 -2
- package/cjs/services/earning-service/handlers/special.js +3 -1
- package/cjs/services/earning-service/service.js +52 -7
- package/cjs/services/history-service/index.js +12 -7
- package/cjs/services/subscan-service/index.js +35 -104
- package/cjs/services/transaction-service/helpers/index.js +2 -0
- package/cjs/services/transaction-service/index.js +15 -0
- package/cjs/services/transaction-service/utils.js +10 -1
- package/cjs/strategy/api-request-strategy/index.js +1 -0
- package/cjs/strategy/api-request-strategy/utils/index.js +2 -2
- package/cjs/strategy/api-request-strategy-v2/index.js +138 -0
- package/cjs/strategy/api-request-strategy-v2/types.js +1 -0
- package/cjs/types/transaction/error.js +1 -0
- package/cjs/utils/account/transform.js +3 -2
- package/cjs/utils/gear/combine.js +4 -3
- package/cjs/utils/gear/vft.js +104 -135
- package/core/logic-validation/transfer.js +7 -0
- package/koni/api/nft/config.d.ts +1 -1
- package/koni/api/nft/config.js +1 -1
- package/koni/api/nft/ordinal_nft/index.js +3 -2
- package/koni/background/handlers/Extension.d.ts +1 -0
- package/koni/background/handlers/Extension.js +21 -1
- package/koni/background/handlers/State.js +4 -1
- package/package.json +20 -9
- package/packageInfo.js +1 -1
- package/services/balance-service/helpers/subscribe/substrate/index.js +8 -14
- package/services/buy-service/index.js +2 -0
- package/services/chain-service/index.js +7 -2
- package/services/chain-service/utils/index.js +3 -0
- 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 -1
- package/services/earning-service/handlers/base.d.ts +5 -3
- package/services/earning-service/handlers/lending/interlay.d.ts +1 -1
- package/services/earning-service/handlers/lending/interlay.js +2 -1
- package/services/earning-service/handlers/liquid-staking/acala.d.ts +1 -1
- package/services/earning-service/handlers/liquid-staking/acala.js +2 -1
- package/services/earning-service/handlers/liquid-staking/bifrost.d.ts +1 -1
- package/services/earning-service/handlers/liquid-staking/bifrost.js +2 -1
- package/services/earning-service/handlers/liquid-staking/parallel.d.ts +1 -1
- package/services/earning-service/handlers/liquid-staking/parallel.js +2 -1
- package/services/earning-service/handlers/liquid-staking/stella-swap.d.ts +1 -1
- package/services/earning-service/handlers/liquid-staking/stella-swap.js +2 -1
- package/services/earning-service/handlers/native-staking/amplitude.d.ts +1 -0
- package/services/earning-service/handlers/native-staking/amplitude.js +32 -0
- package/services/earning-service/handlers/native-staking/astar.d.ts +2 -1
- package/services/earning-service/handlers/native-staking/astar.js +20 -1
- package/services/earning-service/handlers/native-staking/base.d.ts +4 -2
- package/services/earning-service/handlers/native-staking/base.js +42 -30
- package/services/earning-service/handlers/native-staking/dtao.d.ts +5 -3
- package/services/earning-service/handlers/native-staking/dtao.js +80 -22
- package/services/earning-service/handlers/native-staking/mythos.d.ts +2 -1
- package/services/earning-service/handlers/native-staking/mythos.js +30 -1
- package/services/earning-service/handlers/native-staking/para-chain.d.ts +1 -0
- package/services/earning-service/handlers/native-staking/para-chain.js +17 -0
- package/services/earning-service/handlers/native-staking/relay-chain.d.ts +6 -1
- package/services/earning-service/handlers/native-staking/relay-chain.js +50 -7
- package/services/earning-service/handlers/native-staking/tao.d.ts +23 -4
- package/services/earning-service/handlers/native-staking/tao.js +99 -33
- package/services/earning-service/handlers/nomination-pool/index.d.ts +3 -2
- package/services/earning-service/handlers/nomination-pool/index.js +5 -2
- package/services/earning-service/handlers/special.d.ts +2 -1
- package/services/earning-service/handlers/special.js +3 -1
- package/services/earning-service/service.d.ts +3 -1
- package/services/earning-service/service.js +52 -7
- package/services/history-service/index.js +12 -7
- package/services/subscan-service/index.d.ts +13 -27
- package/services/subscan-service/index.js +26 -95
- package/services/transaction-service/helpers/index.js +2 -0
- package/services/transaction-service/index.js +15 -0
- package/services/transaction-service/utils.js +11 -2
- package/strategy/api-request-strategy/context/base.d.ts +2 -6
- package/strategy/api-request-strategy/index.js +1 -0
- package/strategy/api-request-strategy/types.d.ts +4 -2
- package/strategy/api-request-strategy/utils/index.js +2 -2
- package/strategy/api-request-strategy-v2/index.d.ts +22 -0
- package/strategy/api-request-strategy-v2/index.js +128 -0
- package/strategy/api-request-strategy-v2/types.d.ts +11 -0
- package/strategy/api-request-strategy-v2/types.js +1 -0
- package/types/buy.d.ts +1 -1
- package/types/transaction/error.d.ts +2 -1
- package/types/transaction/error.js +1 -0
- package/types/yield/actions/join/submit.d.ts +10 -1
- package/types/yield/info/chain/info.d.ts +2 -0
- package/utils/account/transform.js +3 -2
- package/utils/gear/combine.d.ts +2 -1
- package/utils/gear/combine.js +4 -4
- package/utils/gear/vft.d.ts +20 -9
- package/utils/gear/vft.js +104 -135
|
@@ -16,13 +16,12 @@ var _utils3 = require("@subwallet/extension-base/utils");
|
|
|
16
16
|
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
17
17
|
var _i18next = require("i18next");
|
|
18
18
|
var _util = require("@polkadot/util");
|
|
19
|
-
var _utils4 = require("../../utils");
|
|
20
19
|
var _tao = require("./tao");
|
|
21
20
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
22
21
|
// SPDX-License-Identifier: Apache-2.0
|
|
23
22
|
|
|
24
23
|
const DEFAULT_BITTENSOR_SLIPPAGE = 0.005;
|
|
25
|
-
const DEFAULT_DTAO_MINBOND = '
|
|
24
|
+
const DEFAULT_DTAO_MINBOND = '21000000';
|
|
26
25
|
exports.DEFAULT_DTAO_MINBOND = DEFAULT_DTAO_MINBOND;
|
|
27
26
|
const getAlphaToTaoMapping = async substrateApi => {
|
|
28
27
|
const allSubnets = (await substrateApi.api.call.subnetInfoRuntimeApi.getAllDynamicInfo()).toJSON();
|
|
@@ -70,7 +69,8 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
|
|
|
70
69
|
fastUnstake: false,
|
|
71
70
|
cancelUnstake: false,
|
|
72
71
|
withdraw: false,
|
|
73
|
-
claimReward: false
|
|
72
|
+
claimReward: false,
|
|
73
|
+
changeValidator: true
|
|
74
74
|
};
|
|
75
75
|
constructor(state, chain) {
|
|
76
76
|
super(state, chain);
|
|
@@ -372,6 +372,11 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
|
|
|
372
372
|
};
|
|
373
373
|
}
|
|
374
374
|
|
|
375
|
+
// Because not have subscan api
|
|
376
|
+
async checkAccountHaveStake(useAddresses) {
|
|
377
|
+
return Promise.resolve([]);
|
|
378
|
+
}
|
|
379
|
+
|
|
375
380
|
/* Subscribe pool position */
|
|
376
381
|
|
|
377
382
|
/* Get pool targets */
|
|
@@ -396,32 +401,37 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
|
|
|
396
401
|
isCrowded: false
|
|
397
402
|
}));
|
|
398
403
|
}
|
|
399
|
-
async getMainnetPoolTargets() {
|
|
404
|
+
async getMainnetPoolTargets(netuid) {
|
|
400
405
|
const _topValidator = await this.bittensorCache.get();
|
|
401
406
|
const topValidator = _topValidator;
|
|
402
407
|
const bnMinBond = new _bignumber.default(DEFAULT_DTAO_MINBOND);
|
|
403
408
|
const validatorList = topValidator.data;
|
|
404
|
-
const
|
|
405
|
-
const
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
const
|
|
411
|
-
|
|
409
|
+
const aprResponse = await this.bittensorCache.fetchApr(netuid);
|
|
410
|
+
const aprMap = {};
|
|
411
|
+
aprResponse.data.forEach(item => {
|
|
412
|
+
aprMap[item.hotkey.ss58] = item.thirty_day_apy;
|
|
413
|
+
});
|
|
414
|
+
const results = await Promise.all(validatorList.map(validator => {
|
|
415
|
+
const address = validator.hotkey.ss58;
|
|
416
|
+
// With bittensor we use total weight, root weight and alpha staked insted of total stake, own stake and other stake
|
|
417
|
+
const bnTotalWeightStake = new _bignumber.default(validator.global_weighted_stake);
|
|
418
|
+
const bnRootWeightStake = new _bignumber.default(validator.weighted_root_stake);
|
|
419
|
+
const bnAlphaStake = new _bignumber.default(validator.global_alpha_stake_as_tao);
|
|
420
|
+
const nominatorCount = validator.global_nominators;
|
|
421
|
+
const commission = validator.take;
|
|
412
422
|
const roundedCommission = (parseFloat(commission) * 100).toFixed(0);
|
|
413
|
-
const apr =
|
|
414
|
-
const
|
|
415
|
-
const name =
|
|
423
|
+
const apr = aprMap[address];
|
|
424
|
+
const expectedReturn = apr ? new _bignumber.default(apr).multipliedBy(100).toFixed(2) : '0';
|
|
425
|
+
const name = validator.name || address;
|
|
416
426
|
return {
|
|
417
427
|
address: address,
|
|
418
|
-
totalStake:
|
|
419
|
-
ownStake:
|
|
420
|
-
otherStake:
|
|
428
|
+
totalStake: bnTotalWeightStake.toString(),
|
|
429
|
+
ownStake: bnRootWeightStake.toString(),
|
|
430
|
+
otherStake: bnAlphaStake.toString(),
|
|
421
431
|
minBond: bnMinBond.toString(),
|
|
422
432
|
nominatorCount: nominatorCount,
|
|
423
433
|
commission: roundedCommission,
|
|
424
|
-
expectedReturn:
|
|
434
|
+
expectedReturn: expectedReturn,
|
|
425
435
|
blocked: false,
|
|
426
436
|
isVerified: false,
|
|
427
437
|
chain: this.chain,
|
|
@@ -431,10 +441,10 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
|
|
|
431
441
|
}));
|
|
432
442
|
return results;
|
|
433
443
|
}
|
|
434
|
-
async getPoolTargets() {
|
|
444
|
+
async getPoolTargets(netuid) {
|
|
435
445
|
await this.init();
|
|
436
446
|
if (this.chain === 'bittensor') {
|
|
437
|
-
return this.getMainnetPoolTargets();
|
|
447
|
+
return this.getMainnetPoolTargets(netuid);
|
|
438
448
|
} else {
|
|
439
449
|
return this.getDevnetPoolTargets();
|
|
440
450
|
}
|
|
@@ -451,6 +461,9 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
|
|
|
451
461
|
selectedValidators: targetValidators,
|
|
452
462
|
subnetData
|
|
453
463
|
} = data;
|
|
464
|
+
if (!subnetData) {
|
|
465
|
+
throw new Error(_types.BasicTxErrorType.INVALID_PARAMS);
|
|
466
|
+
}
|
|
454
467
|
const {
|
|
455
468
|
netuid,
|
|
456
469
|
slippage
|
|
@@ -460,6 +473,8 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
|
|
|
460
473
|
const alphaToTaoPrice = new _bignumber.default(await getAlphaToTaoRate(this.substrateApi, netuid));
|
|
461
474
|
const limitPrice = alphaToTaoPrice.multipliedBy(10 ** (0, _utils2._getAssetDecimals)(this.nativeToken)).multipliedBy(1 + (slippage || DEFAULT_BITTENSOR_SLIPPAGE));
|
|
462
475
|
const BNlimitPrice = new _bignumber.default(limitPrice.integerValue(_bignumber.default.ROUND_CEIL).toFixed());
|
|
476
|
+
|
|
477
|
+
// Bittensor only supports changing 1 validator at a time, not multiple
|
|
463
478
|
const selectedValidatorInfo = targetValidators[0];
|
|
464
479
|
const hotkey = selectedValidatorInfo.address;
|
|
465
480
|
const extrinsic = chainApi.api.tx.subtensorModule.addStakeLimit(hotkey, netuid, binaryAmount.toFixed(), BNlimitPrice.toFixed(), false);
|
|
@@ -468,6 +483,8 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
|
|
|
468
483
|
amount: '0'
|
|
469
484
|
}];
|
|
470
485
|
}
|
|
486
|
+
|
|
487
|
+
// Validate for case stake more
|
|
471
488
|
async validateYieldJoin(data, path) {
|
|
472
489
|
const baseErrors = await super.validateYieldJoin(data, path);
|
|
473
490
|
if (baseErrors.length > 0) {
|
|
@@ -519,5 +536,46 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
|
|
|
519
536
|
}
|
|
520
537
|
|
|
521
538
|
/* Leave pool action */
|
|
539
|
+
|
|
540
|
+
/* Change validator */
|
|
541
|
+
async handleChangeEarningValidator(data) {
|
|
542
|
+
const chainApi = await this.substrateApi.isReady;
|
|
543
|
+
const {
|
|
544
|
+
amount,
|
|
545
|
+
maxAmount,
|
|
546
|
+
metadata,
|
|
547
|
+
originValidator,
|
|
548
|
+
selectedValidators: targetValidators,
|
|
549
|
+
subnetData
|
|
550
|
+
} = data;
|
|
551
|
+
if (!subnetData || !originValidator) {
|
|
552
|
+
return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS));
|
|
553
|
+
}
|
|
554
|
+
const {
|
|
555
|
+
netuid
|
|
556
|
+
} = subnetData;
|
|
557
|
+
const selectedValidatorInfo = targetValidators[0];
|
|
558
|
+
const destValidator = selectedValidatorInfo.address;
|
|
559
|
+
if (new _bignumber.default(amount).lte(0)) {
|
|
560
|
+
return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)('Amount must be greater than 0')));
|
|
561
|
+
}
|
|
562
|
+
if (originValidator === destValidator) {
|
|
563
|
+
return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, 'From validator is the same with to validator'));
|
|
564
|
+
}
|
|
565
|
+
const alphaToTaoPrice = new _bignumber.default(await getAlphaToTaoRate(this.substrateApi, netuid || 0));
|
|
566
|
+
const minUnstake = new _bignumber.default(DEFAULT_DTAO_MINBOND).dividedBy(alphaToTaoPrice);
|
|
567
|
+
const formattedMinUnstake = minUnstake.dividedBy(1000000).integerValue(_bignumber.default.ROUND_CEIL).dividedBy(1000);
|
|
568
|
+
const bnMinUnstake = formattedMinUnstake.multipliedBy(10 ** (0, _utils2._getAssetDecimals)(this.nativeToken));
|
|
569
|
+
if (new _bignumber.default(maxAmount).lt(bnMinUnstake)) {
|
|
570
|
+
return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)(`Amount too low. You need to move at least ${formattedMinUnstake.toString()} ${(metadata === null || metadata === void 0 ? void 0 : metadata.subnetSymbol) || ''}`)));
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
// Avoid remaining amount too low -> can't do anything with that amount
|
|
574
|
+
if (!(maxAmount === amount) && new _bignumber.default(maxAmount).minus(new _bignumber.default(amount)).lt(bnMinUnstake)) {
|
|
575
|
+
return Promise.reject(new _TransactionError.TransactionError(_types.StakingTxErrorType.REMAINING_AMOUNT_TOO_LOW, (0, _i18next.t)(`Your remaining stake on the initial validator will fall below minimum active stake and cannot be unstaked if you proceed with the chosen amount. Hit "Move all" to move all ${(0, _utils3.formatNumber)(maxAmount, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${(metadata === null || metadata === void 0 ? void 0 : metadata.subnetSymbol) || ''} to the new validator, or "Cancel" and lower the amount, then try again`)));
|
|
576
|
+
}
|
|
577
|
+
const extrinsic = chainApi.api.tx.subtensorModule.moveStake(originValidator, destValidator, netuid, netuid, amount);
|
|
578
|
+
return extrinsic;
|
|
579
|
+
}
|
|
522
580
|
}
|
|
523
581
|
exports.default = SubnetTaoStakingPoolHandler;
|
|
@@ -37,7 +37,8 @@ class MythosNativeStakingPoolHandler extends _basePara.default {
|
|
|
37
37
|
fastUnstake: false,
|
|
38
38
|
cancelUnstake: false,
|
|
39
39
|
withdraw: true,
|
|
40
|
-
claimReward: true
|
|
40
|
+
claimReward: true,
|
|
41
|
+
changeValidator: false
|
|
41
42
|
};
|
|
42
43
|
|
|
43
44
|
/* Subscribe pool info */
|
|
@@ -126,6 +127,34 @@ class MythosNativeStakingPoolHandler extends _basePara.default {
|
|
|
126
127
|
|
|
127
128
|
/* Subscribe pool position */
|
|
128
129
|
|
|
130
|
+
async checkAccountHaveStake(useAddresses) {
|
|
131
|
+
var _substrateApi$api$que, _substrateApi$api$que2, _substrateApi$api$que3;
|
|
132
|
+
const result = [];
|
|
133
|
+
const substrateApi = await this.substrateApi.isReady;
|
|
134
|
+
const ledgers = await ((_substrateApi$api$que = substrateApi.api.query.collatorStaking) === null || _substrateApi$api$que === void 0 ? void 0 : (_substrateApi$api$que2 = _substrateApi$api$que.userStake) === null || _substrateApi$api$que2 === void 0 ? void 0 : (_substrateApi$api$que3 = _substrateApi$api$que2.multi) === null || _substrateApi$api$que3 === void 0 ? void 0 : _substrateApi$api$que3.call(_substrateApi$api$que2, useAddresses));
|
|
135
|
+
const _unstakings = await Promise.all(useAddresses.map(stakerAddress => {
|
|
136
|
+
var _substrateApi$api$que4, _substrateApi$api$que5;
|
|
137
|
+
return (_substrateApi$api$que4 = substrateApi.api.query.collatorStaking) === null || _substrateApi$api$que4 === void 0 ? void 0 : (_substrateApi$api$que5 = _substrateApi$api$que4.releaseQueues) === null || _substrateApi$api$que5 === void 0 ? void 0 : _substrateApi$api$que5.call(_substrateApi$api$que4, stakerAddress);
|
|
138
|
+
}));
|
|
139
|
+
if (!ledgers || !_unstakings) {
|
|
140
|
+
return [];
|
|
141
|
+
}
|
|
142
|
+
for (let i = 0; i < useAddresses.length; i++) {
|
|
143
|
+
const owner = useAddresses[i];
|
|
144
|
+
const _userStake = ledgers[i];
|
|
145
|
+
const userStake = _userStake.toPrimitive();
|
|
146
|
+
const _unstaking = _unstakings[i];
|
|
147
|
+
const unstakings = _unstaking.toPrimitive();
|
|
148
|
+
|
|
149
|
+
// TODO: Need to improve, check if can only load stake info
|
|
150
|
+
if (userStake && userStake.stake !== '0') {
|
|
151
|
+
result.push(owner);
|
|
152
|
+
} else if (unstakings && unstakings.some(unstake => unstake.amount !== '0')) {
|
|
153
|
+
result.push(owner);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
157
|
+
}
|
|
129
158
|
async subscribePoolPosition(useAddresses, resultCallback) {
|
|
130
159
|
let cancel = false;
|
|
131
160
|
const substrateApi = await this.substrateApi.isReady;
|
|
@@ -275,6 +275,23 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
|
|
|
275
275
|
unsub();
|
|
276
276
|
};
|
|
277
277
|
}
|
|
278
|
+
async checkAccountHaveStake(useAddresses) {
|
|
279
|
+
var _substrateApi$api$que, _substrateApi$api$que2, _substrateApi$api$que3;
|
|
280
|
+
const result = [];
|
|
281
|
+
const substrateApi = await this.substrateApi.isReady;
|
|
282
|
+
const ledgers = await ((_substrateApi$api$que = substrateApi.api.query.parachainStaking) === null || _substrateApi$api$que === void 0 ? void 0 : (_substrateApi$api$que2 = _substrateApi$api$que.delegatorState) === null || _substrateApi$api$que2 === void 0 ? void 0 : (_substrateApi$api$que3 = _substrateApi$api$que2.multi) === null || _substrateApi$api$que3 === void 0 ? void 0 : _substrateApi$api$que3.call(_substrateApi$api$que2, useAddresses));
|
|
283
|
+
if (!ledgers) {
|
|
284
|
+
return [];
|
|
285
|
+
}
|
|
286
|
+
for (let i = 0; i < useAddresses.length; i++) {
|
|
287
|
+
const owner = useAddresses[i];
|
|
288
|
+
const delegatorState = ledgers[i].toPrimitive();
|
|
289
|
+
if (delegatorState && delegatorState.total > 0) {
|
|
290
|
+
result.push(owner);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return result;
|
|
294
|
+
}
|
|
278
295
|
|
|
279
296
|
/* Subscribe pool position */
|
|
280
297
|
|
|
@@ -22,6 +22,24 @@ var _base = _interopRequireDefault(require("./base"));
|
|
|
22
22
|
// SPDX-License-Identifier: Apache-2.0
|
|
23
23
|
|
|
24
24
|
class RelayNativeStakingPoolHandler extends _base.default {
|
|
25
|
+
availableMethod = {
|
|
26
|
+
join: true,
|
|
27
|
+
defaultUnstake: true,
|
|
28
|
+
fastUnstake: false,
|
|
29
|
+
cancelUnstake: true,
|
|
30
|
+
withdraw: true,
|
|
31
|
+
claimReward: false,
|
|
32
|
+
changeValidator: false
|
|
33
|
+
};
|
|
34
|
+
constructor(state, chain) {
|
|
35
|
+
super(state, chain);
|
|
36
|
+
if (_constants2._SUPPORT_CHANGE_VALIDATOR_CHAIN.includes(chain)) {
|
|
37
|
+
this.availableMethod = {
|
|
38
|
+
...this.availableMethod,
|
|
39
|
+
changeValidator: true
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
25
43
|
/* Subscribe pool info */
|
|
26
44
|
|
|
27
45
|
async subscribePoolInfo(callback) {
|
|
@@ -290,6 +308,22 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
290
308
|
unsub === null || unsub === void 0 ? void 0 : unsub();
|
|
291
309
|
};
|
|
292
310
|
}
|
|
311
|
+
async checkAccountHaveStake(useAddresses) {
|
|
312
|
+
var _substrateApi$api$que22, _substrateApi$api$que23, _substrateApi$api$que24;
|
|
313
|
+
const result = [];
|
|
314
|
+
const substrateApi = await this.substrateApi.isReady;
|
|
315
|
+
const ledgers = await ((_substrateApi$api$que22 = substrateApi.api.query.staking) === null || _substrateApi$api$que22 === void 0 ? void 0 : (_substrateApi$api$que23 = _substrateApi$api$que22.ledger) === null || _substrateApi$api$que23 === void 0 ? void 0 : (_substrateApi$api$que24 = _substrateApi$api$que23.multi) === null || _substrateApi$api$que24 === void 0 ? void 0 : _substrateApi$api$que24.call(_substrateApi$api$que23, useAddresses));
|
|
316
|
+
if (ledgers) {
|
|
317
|
+
for (let i = 0; i < useAddresses.length; i++) {
|
|
318
|
+
const address = useAddresses[i];
|
|
319
|
+
const _ledger = ledgers[i].toPrimitive();
|
|
320
|
+
if (_ledger.total > 0) {
|
|
321
|
+
result.push(address);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return result;
|
|
326
|
+
}
|
|
293
327
|
|
|
294
328
|
/* Subscribe pool position */
|
|
295
329
|
|
|
@@ -660,13 +694,11 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
660
694
|
const chainApi = await this.substrateApi.isReady;
|
|
661
695
|
if (chainApi.api.tx.staking.withdrawUnbonded.meta.args.length === 1) {
|
|
662
696
|
let slashingSpanCount;
|
|
663
|
-
if (chainApi.api.query.staking.
|
|
664
|
-
const currentEra = await chainApi.api.query.staking.currentEra();
|
|
665
|
-
const slashingSpans = (await chainApi.api.query.staking.nominatorSlashInEra(currentEra.toPrimitive(), address)).toPrimitive();
|
|
666
|
-
slashingSpanCount = slashingSpans !== null ? slashingSpans.toString() : '0';
|
|
667
|
-
} else {
|
|
697
|
+
if (chainApi.api.query.staking.slashingSpans) {
|
|
668
698
|
const _slashingSpans = (await chainApi.api.query.staking.slashingSpans(address)).toHuman();
|
|
669
699
|
slashingSpanCount = _slashingSpans !== null ? _slashingSpans.spanIndex : '0';
|
|
700
|
+
} else {
|
|
701
|
+
slashingSpanCount = chainApi.api.consts.staking.historyDepth.toPrimitive();
|
|
670
702
|
}
|
|
671
703
|
return chainApi.api.tx.staking.withdrawUnbonded(slashingSpanCount);
|
|
672
704
|
} else {
|
|
@@ -674,7 +706,18 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
674
706
|
return chainApi.api.tx.staking.withdrawUnbonded();
|
|
675
707
|
}
|
|
676
708
|
}
|
|
677
|
-
|
|
709
|
+
async handleChangeEarningValidator(data) {
|
|
710
|
+
const chainApi = await this.substrateApi.isReady;
|
|
711
|
+
const {
|
|
712
|
+
selectedValidators
|
|
713
|
+
} = data;
|
|
714
|
+
if (!selectedValidators || selectedValidators.length === 0) {
|
|
715
|
+
return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS));
|
|
716
|
+
}
|
|
717
|
+
const validatorParamList = selectedValidators.map(validator => validator.address);
|
|
718
|
+
const nominateTx = chainApi.api.tx.staking.nominate(validatorParamList);
|
|
719
|
+
return nominateTx;
|
|
720
|
+
}
|
|
678
721
|
/* Other actions */
|
|
679
722
|
}
|
|
680
723
|
exports.default = RelayNativeStakingPoolHandler;
|
|
@@ -17,8 +17,6 @@ var _utils3 = require("@subwallet/extension-base/utils");
|
|
|
17
17
|
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
18
18
|
var _i18next = require("i18next");
|
|
19
19
|
var _util = require("@polkadot/util");
|
|
20
|
-
var _utils4 = require("../../utils");
|
|
21
|
-
var _dtao = require("./dtao");
|
|
22
20
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
23
21
|
// SPDX-License-Identifier: Apache-2.0
|
|
24
22
|
|
|
@@ -49,7 +47,7 @@ class BittensorCache {
|
|
|
49
47
|
}
|
|
50
48
|
async fetchData() {
|
|
51
49
|
try {
|
|
52
|
-
const resp = await (0, _utils3.fetchFromProxyService)(_environment.ProxyServiceRoute.BITTENSOR, '/validator/latest/v1?limit=
|
|
50
|
+
const resp = await (0, _utils3.fetchFromProxyService)(_environment.ProxyServiceRoute.BITTENSOR, '/dtao/validator/latest/v1?limit=100', {
|
|
53
51
|
method: 'GET',
|
|
54
52
|
headers: {
|
|
55
53
|
'Content-Type': 'application/json'
|
|
@@ -63,7 +61,7 @@ class BittensorCache {
|
|
|
63
61
|
}
|
|
64
62
|
const rawData = await resp.json();
|
|
65
63
|
const data = {
|
|
66
|
-
data: rawData.data.filter(validator => parseFloat(validator.
|
|
64
|
+
data: rawData.data.filter(validator => parseFloat(validator.root_stake) > 0)
|
|
67
65
|
};
|
|
68
66
|
this.cache = data;
|
|
69
67
|
this.promise = null;
|
|
@@ -86,6 +84,27 @@ class BittensorCache {
|
|
|
86
84
|
};
|
|
87
85
|
}
|
|
88
86
|
}
|
|
87
|
+
async fetchApr(netuid) {
|
|
88
|
+
try {
|
|
89
|
+
const resp = await (0, _utils3.fetchFromProxyService)(_environment.ProxyServiceRoute.BITTENSOR, `/dtao/validator/yield/latest/v1?netuid=${netuid}&limit=100&order=thirty_day_apy_desc`, {
|
|
90
|
+
method: 'GET',
|
|
91
|
+
headers: {
|
|
92
|
+
'Content-Type': 'application/json'
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
const rawData = await resp.json();
|
|
96
|
+
|
|
97
|
+
// Some subnets not return data, ensure the structure is consistent by returning an empty array
|
|
98
|
+
return Array.isArray(rawData.data) ? rawData : {
|
|
99
|
+
data: []
|
|
100
|
+
};
|
|
101
|
+
} catch (error) {
|
|
102
|
+
console.error(error);
|
|
103
|
+
return {
|
|
104
|
+
data: []
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
89
108
|
}
|
|
90
109
|
|
|
91
110
|
// export async function fetchTaoDelegateState (address: string): Promise<RawDelegateState> {
|
|
@@ -124,7 +143,8 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
|
|
|
124
143
|
fastUnstake: false,
|
|
125
144
|
cancelUnstake: false,
|
|
126
145
|
withdraw: false,
|
|
127
|
-
claimReward: false
|
|
146
|
+
claimReward: false,
|
|
147
|
+
changeValidator: true
|
|
128
148
|
};
|
|
129
149
|
constructor(state, chain) {
|
|
130
150
|
super(state, chain);
|
|
@@ -160,23 +180,18 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
|
|
|
160
180
|
const minDelegatorStake = (await substrateApi.api.query.subtensorModule.nominatorMinRequiredStake()).toPrimitive() || 0;
|
|
161
181
|
const maxValidatorPerNominator = (await substrateApi.api.query.subtensorModule.maxAllowedValidators(0)).toPrimitive();
|
|
162
182
|
const taoIn = (await substrateApi.api.query.subtensorModule.subnetTAO(0)).toPrimitive();
|
|
163
|
-
const _topValidator = await this.bittensorCache.
|
|
183
|
+
const _topValidator = await this.bittensorCache.fetchApr(0);
|
|
164
184
|
const validators = _topValidator.data;
|
|
165
|
-
|
|
166
|
-
for (let i = 1; i < validators.length; i++) {
|
|
167
|
-
if (parseFloat(validators[i].apr) > parseFloat(highestApr.apr)) {
|
|
168
|
-
highestApr = validators[i];
|
|
169
|
-
}
|
|
170
|
-
}
|
|
185
|
+
const highestApr = validators[0];
|
|
171
186
|
const bnTaoIn = new _bignumber.default(taoIn);
|
|
172
187
|
const BNminDelegatorStake = new _bignumber.default(minDelegatorStake.toString());
|
|
173
|
-
const apr = this.chain === 'bittensor' ? Number(highestApr.
|
|
188
|
+
const apr = this.chain === 'bittensor' ? Number(highestApr.thirty_day_apy) * 100 : 0;
|
|
174
189
|
const data = {
|
|
175
190
|
...this.baseInfo,
|
|
176
191
|
type: this.type,
|
|
177
192
|
metadata: {
|
|
178
193
|
...this.metadataInfo,
|
|
179
|
-
description: this.getDescription()
|
|
194
|
+
description: this.getDescription((0, _utils3.formatNumber)(BNminDelegatorStake, (0, _utils2._getAssetDecimals)(this.nativeToken)))
|
|
180
195
|
},
|
|
181
196
|
statistic: {
|
|
182
197
|
assetEarning: [{
|
|
@@ -387,6 +402,11 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
|
|
|
387
402
|
};
|
|
388
403
|
}
|
|
389
404
|
|
|
405
|
+
// Because not have subscan api
|
|
406
|
+
async checkAccountHaveStake(useAddresses) {
|
|
407
|
+
return Promise.resolve([]);
|
|
408
|
+
}
|
|
409
|
+
|
|
390
410
|
/* Subscribe pool position */
|
|
391
411
|
|
|
392
412
|
/* Get pool targets */
|
|
@@ -418,27 +438,32 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
|
|
|
418
438
|
const nominatorMinRequiredStake = (await getNominatorMinRequiredStake).toString();
|
|
419
439
|
const bnMinBond = new _bignumber.default(nominatorMinRequiredStake);
|
|
420
440
|
const validatorList = topValidator.data;
|
|
421
|
-
const
|
|
422
|
-
const
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
const
|
|
428
|
-
|
|
441
|
+
const aprResponse = await this.bittensorCache.fetchApr(0);
|
|
442
|
+
const aprMap = {};
|
|
443
|
+
aprResponse.data.forEach(item => {
|
|
444
|
+
aprMap[item.hotkey.ss58] = item.thirty_day_apy;
|
|
445
|
+
});
|
|
446
|
+
const results = await Promise.all(validatorList.map(validator => {
|
|
447
|
+
const address = validator.hotkey.ss58;
|
|
448
|
+
// With bittensor we use total weight, root weight and alpha staked insted of total stake, own stake and other stake
|
|
449
|
+
const bnTotalWeightStake = new _bignumber.default(validator.global_weighted_stake);
|
|
450
|
+
const bnRootWeightStake = new _bignumber.default(validator.weighted_root_stake);
|
|
451
|
+
const bnAlphaStake = new _bignumber.default(validator.global_alpha_stake_as_tao);
|
|
452
|
+
const nominatorCount = validator.global_nominators;
|
|
453
|
+
const commission = validator.take;
|
|
429
454
|
const roundedCommission = (parseFloat(commission) * 100).toFixed(0);
|
|
430
|
-
const apr =
|
|
431
|
-
const
|
|
432
|
-
const name =
|
|
455
|
+
const apr = aprMap[address];
|
|
456
|
+
const expectedReturn = apr ? new _bignumber.default(apr).multipliedBy(100).toFixed(2) : '0';
|
|
457
|
+
const name = validator.name || address;
|
|
433
458
|
return {
|
|
434
459
|
address: address,
|
|
435
|
-
totalStake:
|
|
436
|
-
ownStake:
|
|
437
|
-
otherStake:
|
|
460
|
+
totalStake: bnTotalWeightStake.toString(),
|
|
461
|
+
ownStake: bnRootWeightStake.toString(),
|
|
462
|
+
otherStake: bnAlphaStake.toString(),
|
|
438
463
|
minBond: bnMinBond.toString(),
|
|
439
464
|
nominatorCount: nominatorCount,
|
|
440
465
|
commission: roundedCommission,
|
|
441
|
-
expectedReturn:
|
|
466
|
+
expectedReturn: expectedReturn,
|
|
442
467
|
blocked: false,
|
|
443
468
|
isVerified: false,
|
|
444
469
|
chain: this.chain,
|
|
@@ -476,6 +501,8 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
|
|
|
476
501
|
amount: '0'
|
|
477
502
|
}];
|
|
478
503
|
}
|
|
504
|
+
|
|
505
|
+
// Validate for case stake more
|
|
479
506
|
async validateYieldJoin(data, path) {
|
|
480
507
|
const baseErrors = await super.validateYieldJoin(data, path);
|
|
481
508
|
if (baseErrors.length > 0) {
|
|
@@ -484,8 +511,10 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
|
|
|
484
511
|
const {
|
|
485
512
|
amount
|
|
486
513
|
} = data;
|
|
487
|
-
|
|
488
|
-
|
|
514
|
+
const minDelegatorStake = (await this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake()).toPrimitive() || 0;
|
|
515
|
+
const bnMinStake = minDelegatorStake.toString();
|
|
516
|
+
if (new _bignumber.default(amount).lt(bnMinStake)) {
|
|
517
|
+
return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)(`Insufficient stake. You need to stake at least ${(0, _utils3.formatNumber)(bnMinStake, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${(0, _utils2._getAssetSymbol)(this.nativeToken)} to earn rewards`))];
|
|
489
518
|
}
|
|
490
519
|
return baseErrors;
|
|
491
520
|
}
|
|
@@ -512,7 +541,8 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
|
|
|
512
541
|
if (!poolInfo) {
|
|
513
542
|
return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS)];
|
|
514
543
|
}
|
|
515
|
-
const
|
|
544
|
+
const minDelegatorStake = (await this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake()).toPrimitive() || 0;
|
|
545
|
+
const bnMinUnstake = new _bignumber.default(minDelegatorStake.toString());
|
|
516
546
|
if (new _bignumber.default(amount).lt(bnMinUnstake)) {
|
|
517
547
|
return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)(`Amount too low. You need to unstake at least ${(0, _utils3.formatNumber)(bnMinUnstake, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${(0, _utils2._getAssetSymbol)(this.nativeToken)}`))];
|
|
518
548
|
}
|
|
@@ -520,5 +550,41 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
|
|
|
520
550
|
}
|
|
521
551
|
|
|
522
552
|
/* Leave pool action */
|
|
553
|
+
|
|
554
|
+
/* Change validator */
|
|
555
|
+
async handleChangeEarningValidator(data) {
|
|
556
|
+
const chainApi = await this.substrateApi.isReady;
|
|
557
|
+
const {
|
|
558
|
+
amount,
|
|
559
|
+
maxAmount,
|
|
560
|
+
originValidator,
|
|
561
|
+
selectedValidators: targetValidators
|
|
562
|
+
} = data;
|
|
563
|
+
if (!originValidator) {
|
|
564
|
+
return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS));
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
// Bittensor only supports changing 1 validator at a time, not multiple
|
|
568
|
+
const selectedValidatorInfo = targetValidators[0];
|
|
569
|
+
const destValidator = selectedValidatorInfo.address;
|
|
570
|
+
if (new _bignumber.default(amount).lte(0)) {
|
|
571
|
+
return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)('Amount must be greater than 0')));
|
|
572
|
+
}
|
|
573
|
+
if (originValidator === destValidator) {
|
|
574
|
+
return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, 'From validator is the same with to validator'));
|
|
575
|
+
}
|
|
576
|
+
const minDelegatorStake = (await this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake()).toPrimitive() || 0;
|
|
577
|
+
const bnMinMoveStake = new _bignumber.default(minDelegatorStake.toString());
|
|
578
|
+
if (new _bignumber.default(maxAmount).lt(bnMinMoveStake)) {
|
|
579
|
+
return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)(`Amount too low. You need to move at least ${(0, _utils3.formatNumber)(bnMinMoveStake, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${(0, _utils2._getAssetSymbol)(this.nativeToken)}`)));
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
// Avoid remaining amount too low -> can't do anything with that amount
|
|
583
|
+
if (!(maxAmount === amount) && new _bignumber.default(maxAmount).minus(new _bignumber.default(amount)).lt(bnMinMoveStake)) {
|
|
584
|
+
return Promise.reject(new _TransactionError.TransactionError(_types.StakingTxErrorType.REMAINING_AMOUNT_TOO_LOW, (0, _i18next.t)(`Your remaining stake on the initial validator will fall below minimum active stake and cannot be unstaked if you proceed with the chosen amount. Hit "Move all" to move all ${(0, _utils3.formatNumber)(maxAmount, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${(0, _utils2._getAssetSymbol)(this.nativeToken)} to the new validator, or "Cancel" and lower the amount, then try again`)));
|
|
585
|
+
}
|
|
586
|
+
const extrinsic = chainApi.api.tx.subtensorModule.moveStake(originValidator, destValidator, 0, 0, amount);
|
|
587
|
+
return extrinsic;
|
|
588
|
+
}
|
|
523
589
|
}
|
|
524
590
|
exports.default = TaoNativeStakingPoolHandler;
|
|
@@ -27,7 +27,8 @@ class NominationPoolHandler extends _base.default {
|
|
|
27
27
|
fastUnstake: false,
|
|
28
28
|
cancelUnstake: false,
|
|
29
29
|
withdraw: true,
|
|
30
|
-
claimReward: true
|
|
30
|
+
claimReward: true,
|
|
31
|
+
changeValidator: false
|
|
31
32
|
};
|
|
32
33
|
static generateSlug(symbol, chain) {
|
|
33
34
|
return `${symbol}___nomination_pool___${chain}`;
|
|
@@ -584,7 +585,9 @@ class NominationPoolHandler extends _base.default {
|
|
|
584
585
|
});
|
|
585
586
|
}
|
|
586
587
|
}
|
|
587
|
-
|
|
588
|
+
handleChangeEarningValidator(data) {
|
|
589
|
+
return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED));
|
|
590
|
+
}
|
|
588
591
|
/* Other actions */
|
|
589
592
|
}
|
|
590
593
|
exports.default = NominationPoolHandler;
|
|
@@ -519,7 +519,9 @@ class BaseSpecialStakingPoolHandler extends _base.default {
|
|
|
519
519
|
handleYieldWithdraw(address, unstakingInfo) {
|
|
520
520
|
return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED));
|
|
521
521
|
}
|
|
522
|
-
|
|
522
|
+
handleChangeEarningValidator(data) {
|
|
523
|
+
return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED));
|
|
524
|
+
}
|
|
523
525
|
/* Other actions */
|
|
524
526
|
}
|
|
525
527
|
exports.default = BaseSpecialStakingPoolHandler;
|