@subwallet/extension-base 1.3.47-0 → 1.3.48-1
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/background/handlers/Extension.js +21 -1
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/chain-service/index.js +7 -2
- 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/astar.js +2 -1
- package/cjs/services/earning-service/handlers/native-staking/base.js +5 -1
- package/cjs/services/earning-service/handlers/native-staking/dtao.js +74 -21
- package/cjs/services/earning-service/handlers/native-staking/mythos.js +2 -1
- package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +33 -6
- package/cjs/services/earning-service/handlers/native-staking/tao.js +93 -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 +26 -2
- package/cjs/services/transaction-service/helpers/index.js +2 -0
- package/cjs/services/transaction-service/index.js +15 -0
- package/cjs/types/transaction/error.js +1 -0
- package/cjs/utils/account/transform.js +3 -2
- 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/background/handlers/Extension.d.ts +1 -0
- package/koni/background/handlers/Extension.js +21 -1
- package/package.json +6 -6
- package/packageInfo.js +1 -1
- package/services/chain-service/index.js +7 -2
- 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/astar.d.ts +1 -1
- package/services/earning-service/handlers/native-staking/astar.js +2 -1
- package/services/earning-service/handlers/native-staking/base.d.ts +3 -2
- package/services/earning-service/handlers/native-staking/base.js +5 -1
- package/services/earning-service/handlers/native-staking/dtao.d.ts +4 -3
- package/services/earning-service/handlers/native-staking/dtao.js +75 -22
- package/services/earning-service/handlers/native-staking/mythos.d.ts +1 -1
- package/services/earning-service/handlers/native-staking/mythos.js +2 -1
- package/services/earning-service/handlers/native-staking/relay-chain.d.ts +5 -1
- package/services/earning-service/handlers/native-staking/relay-chain.js +34 -7
- package/services/earning-service/handlers/native-staking/tao.d.ts +22 -4
- package/services/earning-service/handlers/native-staking/tao.js +94 -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 +2 -1
- package/services/earning-service/service.js +26 -2
- package/services/transaction-service/helpers/index.js +2 -0
- package/services/transaction-service/index.js +15 -0
- 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
|
@@ -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: [{
|
|
@@ -423,27 +438,32 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
|
|
|
423
438
|
const nominatorMinRequiredStake = (await getNominatorMinRequiredStake).toString();
|
|
424
439
|
const bnMinBond = new _bignumber.default(nominatorMinRequiredStake);
|
|
425
440
|
const validatorList = topValidator.data;
|
|
426
|
-
const
|
|
427
|
-
const
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
const
|
|
433
|
-
|
|
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;
|
|
434
454
|
const roundedCommission = (parseFloat(commission) * 100).toFixed(0);
|
|
435
|
-
const apr =
|
|
436
|
-
const
|
|
437
|
-
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;
|
|
438
458
|
return {
|
|
439
459
|
address: address,
|
|
440
|
-
totalStake:
|
|
441
|
-
ownStake:
|
|
442
|
-
otherStake:
|
|
460
|
+
totalStake: bnTotalWeightStake.toString(),
|
|
461
|
+
ownStake: bnRootWeightStake.toString(),
|
|
462
|
+
otherStake: bnAlphaStake.toString(),
|
|
443
463
|
minBond: bnMinBond.toString(),
|
|
444
464
|
nominatorCount: nominatorCount,
|
|
445
465
|
commission: roundedCommission,
|
|
446
|
-
expectedReturn:
|
|
466
|
+
expectedReturn: expectedReturn,
|
|
447
467
|
blocked: false,
|
|
448
468
|
isVerified: false,
|
|
449
469
|
chain: this.chain,
|
|
@@ -481,6 +501,8 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
|
|
|
481
501
|
amount: '0'
|
|
482
502
|
}];
|
|
483
503
|
}
|
|
504
|
+
|
|
505
|
+
// Validate for case stake more
|
|
484
506
|
async validateYieldJoin(data, path) {
|
|
485
507
|
const baseErrors = await super.validateYieldJoin(data, path);
|
|
486
508
|
if (baseErrors.length > 0) {
|
|
@@ -489,8 +511,10 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
|
|
|
489
511
|
const {
|
|
490
512
|
amount
|
|
491
513
|
} = data;
|
|
492
|
-
|
|
493
|
-
|
|
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`))];
|
|
494
518
|
}
|
|
495
519
|
return baseErrors;
|
|
496
520
|
}
|
|
@@ -517,7 +541,8 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
|
|
|
517
541
|
if (!poolInfo) {
|
|
518
542
|
return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS)];
|
|
519
543
|
}
|
|
520
|
-
const
|
|
544
|
+
const minDelegatorStake = (await this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake()).toPrimitive() || 0;
|
|
545
|
+
const bnMinUnstake = new _bignumber.default(minDelegatorStake.toString());
|
|
521
546
|
if (new _bignumber.default(amount).lt(bnMinUnstake)) {
|
|
522
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)}`))];
|
|
523
548
|
}
|
|
@@ -525,5 +550,41 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
|
|
|
525
550
|
}
|
|
526
551
|
|
|
527
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
|
+
}
|
|
528
589
|
}
|
|
529
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;
|
|
@@ -384,7 +384,13 @@ class EarningService {
|
|
|
384
384
|
delete onlineData[inactiveSlug];
|
|
385
385
|
}
|
|
386
386
|
Object.values(onlineData).forEach(item => {
|
|
387
|
-
this.
|
|
387
|
+
const handler = this.getPoolHandler(item.slug);
|
|
388
|
+
if (!handler) {
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
const updatedItem = structuredClone(item);
|
|
392
|
+
updatedItem.metadata.availableMethod = handler.availableMethod;
|
|
393
|
+
this.updateYieldPoolInfo(updatedItem);
|
|
388
394
|
});
|
|
389
395
|
return onlineData;
|
|
390
396
|
}
|
|
@@ -724,7 +730,13 @@ class EarningService {
|
|
|
724
730
|
const handler = this.getPoolHandler(slug);
|
|
725
731
|
if (!targets.length && handler) {
|
|
726
732
|
await this.eventService.waitChainReady;
|
|
727
|
-
|
|
733
|
+
const isSubnet = slug.match(/subnet_(\d+)/);
|
|
734
|
+
if (isSubnet) {
|
|
735
|
+
const subnet = Number(isSubnet[1]);
|
|
736
|
+
targets = await handler.getPoolTargets(subnet);
|
|
737
|
+
} else {
|
|
738
|
+
targets = await handler.getPoolTargets();
|
|
739
|
+
}
|
|
728
740
|
}
|
|
729
741
|
return targets;
|
|
730
742
|
}
|
|
@@ -867,6 +879,18 @@ class EarningService {
|
|
|
867
879
|
return Promise.reject(new _TransactionError.TransactionError(_types2.BasicTxErrorType.INTERNAL_ERROR));
|
|
868
880
|
}
|
|
869
881
|
}
|
|
882
|
+
async handleYieldChangeValidator(params) {
|
|
883
|
+
await this.eventService.waitChainReady;
|
|
884
|
+
const {
|
|
885
|
+
slug
|
|
886
|
+
} = params;
|
|
887
|
+
const handler = this.getPoolHandler(slug);
|
|
888
|
+
if (handler) {
|
|
889
|
+
return handler.handleChangeEarningValidator(params);
|
|
890
|
+
} else {
|
|
891
|
+
return Promise.reject(new _TransactionError.TransactionError(_types2.BasicTxErrorType.INTERNAL_ERROR));
|
|
892
|
+
}
|
|
893
|
+
}
|
|
870
894
|
|
|
871
895
|
/* Other */
|
|
872
896
|
|
|
@@ -73,6 +73,8 @@ const typeName = type => {
|
|
|
73
73
|
return 'Withdraw pool';
|
|
74
74
|
case _KoniTypes.ExtrinsicType.JOIN_YIELD_POOL:
|
|
75
75
|
return 'Start earning';
|
|
76
|
+
case _KoniTypes.ExtrinsicType.CHANGE_EARNING_VALIDATOR:
|
|
77
|
+
return 'Change validator';
|
|
76
78
|
case _KoniTypes.ExtrinsicType.UNKNOWN:
|
|
77
79
|
default:
|
|
78
80
|
return 'unknown';
|
|
@@ -916,6 +916,21 @@ class TransactionService {
|
|
|
916
916
|
};
|
|
917
917
|
break;
|
|
918
918
|
}
|
|
919
|
+
case _KoniTypes.ExtrinsicType.CHANGE_EARNING_VALIDATOR:
|
|
920
|
+
{
|
|
921
|
+
var _data$metadata;
|
|
922
|
+
const data = (0, _utils3.parseTransactionData)(transaction.data);
|
|
923
|
+
historyItem.additionalInfo = {
|
|
924
|
+
symbol: ((_data$metadata = data.metadata) === null || _data$metadata === void 0 ? void 0 : _data$metadata.subnetSymbol) || ''
|
|
925
|
+
};
|
|
926
|
+
if (data.amount !== '0') {
|
|
927
|
+
historyItem.amount = {
|
|
928
|
+
...baseNativeAmount,
|
|
929
|
+
value: data.amount
|
|
930
|
+
};
|
|
931
|
+
}
|
|
932
|
+
break;
|
|
933
|
+
}
|
|
919
934
|
case _KoniTypes.ExtrinsicType.EVM_EXECUTE:
|
|
920
935
|
{
|
|
921
936
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
@@ -41,6 +41,7 @@ exports.StakingTxErrorType = StakingTxErrorType;
|
|
|
41
41
|
StakingTxErrorType["INACTIVE_NOMINATION_POOL"] = "INACTIVE_NOMINATION_POOL";
|
|
42
42
|
StakingTxErrorType["CAN_NOT_GET_METADATA"] = "CAN_NOT_GET_METADATA";
|
|
43
43
|
StakingTxErrorType["NOT_ENOUGH_MIN_UNSTAKE"] = "NOT_ENOUGH_MIN_UNSTAKE";
|
|
44
|
+
StakingTxErrorType["REMAINING_AMOUNT_TOO_LOW"] = "REMAINING_AMOUNT_TOO_LOW";
|
|
44
45
|
})(StakingTxErrorType || (exports.StakingTxErrorType = StakingTxErrorType = {}));
|
|
45
46
|
let TransferTxErrorType;
|
|
46
47
|
exports.TransferTxErrorType = TransferTxErrorType;
|
|
@@ -154,7 +154,7 @@ const BASE_TRANSFER_ACTIONS = [_KoniTypes.ExtrinsicType.TRANSFER_BALANCE, _KoniT
|
|
|
154
154
|
const NATIVE_STAKE_ACTIONS = [_KoniTypes.ExtrinsicType.STAKING_BOND, _KoniTypes.ExtrinsicType.STAKING_UNBOND, _KoniTypes.ExtrinsicType.STAKING_WITHDRAW,
|
|
155
155
|
// ExtrinsicType.STAKING_COMPOUNDING,
|
|
156
156
|
// ExtrinsicType.STAKING_CANCEL_COMPOUNDING,
|
|
157
|
-
_KoniTypes.ExtrinsicType.STAKING_CANCEL_UNSTAKE];
|
|
157
|
+
_KoniTypes.ExtrinsicType.STAKING_CANCEL_UNSTAKE, _KoniTypes.ExtrinsicType.CHANGE_EARNING_VALIDATOR];
|
|
158
158
|
const POOL_STAKE_ACTIONS = [_KoniTypes.ExtrinsicType.STAKING_JOIN_POOL, _KoniTypes.ExtrinsicType.STAKING_LEAVE_POOL, _KoniTypes.ExtrinsicType.STAKING_POOL_WITHDRAW, _KoniTypes.ExtrinsicType.STAKING_CLAIM_REWARD, _KoniTypes.ExtrinsicType.JOIN_YIELD_POOL];
|
|
159
159
|
const EARN_VDOT_ACTIONS = [_KoniTypes.ExtrinsicType.MINT_VDOT, _KoniTypes.ExtrinsicType.REDEEM_VDOT, _KoniTypes.ExtrinsicType.UNSTAKE_VDOT];
|
|
160
160
|
const EARN_LDOT_ACTIONS = [_KoniTypes.ExtrinsicType.MINT_LDOT, _KoniTypes.ExtrinsicType.REDEEM_LDOT, _KoniTypes.ExtrinsicType.UNSTAKE_LDOT];
|
|
@@ -402,8 +402,9 @@ const convertAccountProxyType = accountSignMode => {
|
|
|
402
402
|
return _types2.AccountProxyType.ALL_ACCOUNT;
|
|
403
403
|
case _types2.AccountSignMode.UNKNOWN:
|
|
404
404
|
return _types2.AccountProxyType.UNKNOWN;
|
|
405
|
+
default:
|
|
406
|
+
return _types2.AccountProxyType.UNKNOWN;
|
|
405
407
|
}
|
|
406
|
-
return _types2.AccountProxyType.UNKNOWN;
|
|
407
408
|
};
|
|
408
409
|
exports.convertAccountProxyType = convertAccountProxyType;
|
|
409
410
|
const _combineAccounts = (accounts, modifyPairs, accountProxies) => {
|
|
@@ -188,6 +188,13 @@ export function checkSupportForAction(validationResponse, blockedActionsMap) {
|
|
|
188
188
|
currentAction = `${extrinsicType}___${chain}`;
|
|
189
189
|
break;
|
|
190
190
|
}
|
|
191
|
+
case ExtrinsicType.CHANGE_EARNING_VALIDATOR:
|
|
192
|
+
{
|
|
193
|
+
const data = validationResponse.data;
|
|
194
|
+
const slug = data.slug;
|
|
195
|
+
currentAction = `${extrinsicType}___${slug}`;
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
191
198
|
case ExtrinsicType.STAKING_CLAIM_REWARD:
|
|
192
199
|
{
|
|
193
200
|
const data = validationResponse.data;
|
package/koni/api/nft/config.d.ts
CHANGED
|
@@ -32,7 +32,7 @@ export declare const IPFS_FLEEK = "https://ipfs.fleek.co/ipfs/";
|
|
|
32
32
|
export declare const W3S_IPFS = "https://w3s.link/ipfs/";
|
|
33
33
|
export declare const IPFS2_RMRK = "https://ipfs2.rmrk.link/ipfs/";
|
|
34
34
|
export declare const IPFS_ETH_ARAGON = "https://ipfs.eth.aragon.network/ipfs/";
|
|
35
|
-
export declare const SUBWALLET_IPFS = "https://ipfs.subwallet.app/ipfs/";
|
|
35
|
+
export declare const SUBWALLET_IPFS = "https://ipfs-files.subwallet.app/ipfs/";
|
|
36
36
|
export declare enum SUPPORTED_NFT_NETWORKS {
|
|
37
37
|
karura = "karura",
|
|
38
38
|
acala = "acala",
|
package/koni/api/nft/config.js
CHANGED
|
@@ -62,7 +62,7 @@ export const IPFS_FLEEK = 'https://ipfs.fleek.co/ipfs/';
|
|
|
62
62
|
export const W3S_IPFS = 'https://w3s.link/ipfs/'; // 400
|
|
63
63
|
export const IPFS2_RMRK = 'https://ipfs2.rmrk.link/ipfs/'; // ????
|
|
64
64
|
export const IPFS_ETH_ARAGON = 'https://ipfs.eth.aragon.network/ipfs/'; // 400
|
|
65
|
-
export const SUBWALLET_IPFS = 'https://ipfs.subwallet.app/ipfs/'; // ???
|
|
65
|
+
export const SUBWALLET_IPFS = 'https://ipfs-files.subwallet.app/ipfs/'; // ???
|
|
66
66
|
|
|
67
67
|
export let SUPPORTED_NFT_NETWORKS;
|
|
68
68
|
(function (SUPPORTED_NFT_NETWORKS) {
|
|
@@ -253,6 +253,7 @@ export default class KoniExtension {
|
|
|
253
253
|
private yieldSubmitCancelWithdrawal;
|
|
254
254
|
private yieldSubmitClaimReward;
|
|
255
255
|
private yieldGetEarningSlippage;
|
|
256
|
+
private handleYieldChangeValidator;
|
|
256
257
|
private unlockDotCheckCanMint;
|
|
257
258
|
private unlockDotSubscribeMintedData;
|
|
258
259
|
private subscribeProcessingBanner;
|
|
@@ -3970,6 +3970,25 @@ export default class KoniExtension {
|
|
|
3970
3970
|
const slippage = await this.#koniState.earningService.yieldGetEarningSlippage(params);
|
|
3971
3971
|
return slippage;
|
|
3972
3972
|
}
|
|
3973
|
+
async handleYieldChangeValidator(params) {
|
|
3974
|
+
const {
|
|
3975
|
+
address,
|
|
3976
|
+
slug
|
|
3977
|
+
} = params;
|
|
3978
|
+
const poolHandler = this.#koniState.earningService.getPoolHandler(slug);
|
|
3979
|
+
if (!poolHandler) {
|
|
3980
|
+
return this.#koniState.transactionService.generateBeforeHandleResponseErrors([new TransactionError(BasicTxErrorType.INVALID_PARAMS)]);
|
|
3981
|
+
}
|
|
3982
|
+
const extrinsic = await this.#koniState.earningService.handleYieldChangeValidator(params);
|
|
3983
|
+
return await this.#koniState.transactionService.handleTransaction({
|
|
3984
|
+
address,
|
|
3985
|
+
chain: poolHandler.chain,
|
|
3986
|
+
transaction: extrinsic,
|
|
3987
|
+
data: params,
|
|
3988
|
+
extrinsicType: ExtrinsicType.CHANGE_EARNING_VALIDATOR,
|
|
3989
|
+
chainType: ChainType.SUBSTRATE
|
|
3990
|
+
});
|
|
3991
|
+
}
|
|
3973
3992
|
|
|
3974
3993
|
/* Campaign */
|
|
3975
3994
|
|
|
@@ -4839,7 +4858,8 @@ export default class KoniExtension {
|
|
|
4839
4858
|
return await this.yieldSubmitClaimReward(request);
|
|
4840
4859
|
case 'pri(yield.getEarningSlippage)':
|
|
4841
4860
|
return await this.yieldGetEarningSlippage(request);
|
|
4842
|
-
|
|
4861
|
+
case 'pri(yield.changeValidator.submit)':
|
|
4862
|
+
return await this.handleYieldChangeValidator(request);
|
|
4843
4863
|
/* Others */
|
|
4844
4864
|
|
|
4845
4865
|
/* Actions */
|
package/package.json
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"./cjs/detectPackage.js"
|
|
18
18
|
],
|
|
19
19
|
"type": "module",
|
|
20
|
-
"version": "1.3.
|
|
20
|
+
"version": "1.3.48-1",
|
|
21
21
|
"main": "./cjs/index.js",
|
|
22
22
|
"module": "./index.js",
|
|
23
23
|
"types": "./index.d.ts",
|
|
@@ -2866,12 +2866,12 @@
|
|
|
2866
2866
|
"@sora-substrate/type-definitions": "^1.17.7",
|
|
2867
2867
|
"@substrate/connect": "^0.8.9",
|
|
2868
2868
|
"@subwallet/chain-list": "0.2.109",
|
|
2869
|
-
"@subwallet/extension-base": "^1.3.
|
|
2870
|
-
"@subwallet/extension-chains": "^1.3.
|
|
2871
|
-
"@subwallet/extension-dapp": "^1.3.
|
|
2872
|
-
"@subwallet/extension-inject": "^1.3.
|
|
2869
|
+
"@subwallet/extension-base": "^1.3.48-1",
|
|
2870
|
+
"@subwallet/extension-chains": "^1.3.48-1",
|
|
2871
|
+
"@subwallet/extension-dapp": "^1.3.48-1",
|
|
2872
|
+
"@subwallet/extension-inject": "^1.3.48-1",
|
|
2873
2873
|
"@subwallet/keyring": "^0.1.12",
|
|
2874
|
-
"@subwallet/subwallet-api-sdk": "^1.3.
|
|
2874
|
+
"@subwallet/subwallet-api-sdk": "^1.3.48-1",
|
|
2875
2875
|
"@subwallet/ui-keyring": "^0.1.12",
|
|
2876
2876
|
"@ton/core": "^0.56.3",
|
|
2877
2877
|
"@ton/crypto": "^3.2.0",
|
package/packageInfo.js
CHANGED
|
@@ -7,5 +7,5 @@ export const packageInfo = {
|
|
|
7
7
|
name: '@subwallet/extension-base',
|
|
8
8
|
path: (import.meta && import.meta.url) ? new URL(import.meta.url).pathname.substring(0, new URL(import.meta.url).pathname.lastIndexOf('/') + 1) : 'auto',
|
|
9
9
|
type: 'esm',
|
|
10
|
-
version: '1.3.
|
|
10
|
+
version: '1.3.48-1'
|
|
11
11
|
};
|
|
@@ -667,15 +667,20 @@ export class ChainService {
|
|
|
667
667
|
const priorityTokensMap = this.priorityTokensSubject.value || {};
|
|
668
668
|
const priorityTokensList = priorityTokensMap.token && typeof priorityTokensMap.token === 'object' ? Object.keys(priorityTokensMap.token) : [];
|
|
669
669
|
for (const assetSlug of priorityTokensList) {
|
|
670
|
-
const assetState = assetSettings[assetSlug];
|
|
671
670
|
const assetInfo = this.getAssetBySlug(assetSlug);
|
|
671
|
+
|
|
672
|
+
// This can occur if the assetSlug is not present in the current chainlist version
|
|
673
|
+
if (!assetInfo) {
|
|
674
|
+
continue;
|
|
675
|
+
}
|
|
676
|
+
const assetState = assetSettings[assetSlug];
|
|
672
677
|
const chainState = chainStateMap[assetInfo.originChain];
|
|
673
678
|
if (!assetState) {
|
|
674
679
|
// If this asset not has asset setting, this token is not enabled before (not turned off before)
|
|
675
680
|
if (!chainState || !chainState.manualTurnOff) {
|
|
676
681
|
await this.updateAssetSetting(assetSlug, {
|
|
677
682
|
visible: true
|
|
678
|
-
},
|
|
683
|
+
}, false);
|
|
679
684
|
}
|
|
680
685
|
}
|
|
681
686
|
}
|
|
@@ -22,3 +22,4 @@ export declare const ST_LIQUID_TOKEN_ABI: Record<string, any>;
|
|
|
22
22
|
export declare const MANTA_VALIDATOR_POINTS_PER_BLOCK = 20;
|
|
23
23
|
export declare const MANTA_MIN_DELEGATION = 500;
|
|
24
24
|
export declare const CHANNEL_ID = 7;
|
|
25
|
+
export declare const _SUPPORT_CHANGE_VALIDATOR_CHAIN: string[];
|
|
@@ -28,4 +28,5 @@ export const MaxEraRewardPointsEras = 14;
|
|
|
28
28
|
export const ST_LIQUID_TOKEN_ABI = require("./abis/st_liquid_token_abi.json");
|
|
29
29
|
export const MANTA_VALIDATOR_POINTS_PER_BLOCK = 20;
|
|
30
30
|
export const MANTA_MIN_DELEGATION = 500;
|
|
31
|
-
export const CHANNEL_ID = 7;
|
|
31
|
+
export const CHANNEL_ID = 7;
|
|
32
|
+
export const _SUPPORT_CHANGE_VALIDATOR_CHAIN = ['polkadot', 'kusama'];
|
|
@@ -3,7 +3,7 @@ import { TransactionError } from '@subwallet/extension-base/background/errors/Tr
|
|
|
3
3
|
import { ChainType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
|
|
4
4
|
import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
|
|
5
5
|
import { _EvmApi, _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
|
|
6
|
-
import { BasePoolInfo, BaseYieldPoolMetadata, EarningRewardHistoryItem, EarningRewardItem, HandleYieldStepData, OptimalYieldPath, OptimalYieldPathParams, RequestEarlyValidateYield, RequestEarningSlippage, ResponseEarlyValidateYield, StakeCancelWithdrawalParams, SubmitYieldJoinData, TransactionData, UnstakingInfo, YieldPoolInfo, YieldPoolMethodInfo, YieldPoolTarget, YieldPoolType, YieldPositionInfo, YieldStepBaseInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
|
|
6
|
+
import { BasePoolInfo, BaseYieldPoolMetadata, EarningRewardHistoryItem, EarningRewardItem, HandleYieldStepData, OptimalYieldPath, OptimalYieldPathParams, RequestEarlyValidateYield, RequestEarningSlippage, ResponseEarlyValidateYield, StakeCancelWithdrawalParams, SubmitChangeValidatorStaking, SubmitYieldJoinData, TransactionData, UnstakingInfo, YieldPoolInfo, YieldPoolMethodInfo, YieldPoolTarget, YieldPoolType, YieldPositionInfo, YieldStepBaseInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
|
|
7
7
|
import { EarningSlippageResult } from './native-staking/dtao';
|
|
8
8
|
/**
|
|
9
9
|
* @class BasePoolHandler
|
|
@@ -27,7 +27,7 @@ export default abstract class BasePoolHandler {
|
|
|
27
27
|
/** Pool's transaction type */
|
|
28
28
|
readonly transactionChainType: ChainType;
|
|
29
29
|
/** Pool's available method */
|
|
30
|
-
|
|
30
|
+
abstract readonly availableMethod: YieldPoolMethodInfo;
|
|
31
31
|
/**
|
|
32
32
|
* @constructor
|
|
33
33
|
* @param {KoniState} state - Koni state
|
|
@@ -61,7 +61,7 @@ export default abstract class BasePoolHandler {
|
|
|
61
61
|
/** Get pool reward history */
|
|
62
62
|
abstract getPoolRewardHistory(useAddresses: string[], callback: (rs: EarningRewardHistoryItem) => void): Promise<VoidFunction>;
|
|
63
63
|
/** Get pool target */
|
|
64
|
-
abstract getPoolTargets(): Promise<YieldPoolTarget[]>;
|
|
64
|
+
abstract getPoolTargets(netuid?: number): Promise<YieldPoolTarget[]>;
|
|
65
65
|
earlyValidate(request: RequestEarlyValidateYield): Promise<ResponseEarlyValidateYield>;
|
|
66
66
|
/**
|
|
67
67
|
* @function firstStepFee
|
|
@@ -113,6 +113,8 @@ export default abstract class BasePoolHandler {
|
|
|
113
113
|
abstract handleYieldCancelUnstake(params: StakeCancelWithdrawalParams): Promise<TransactionData>;
|
|
114
114
|
/** Create `transaction` to claim reward */
|
|
115
115
|
abstract handleYieldClaimReward(address: string, bondReward?: boolean): Promise<TransactionData>;
|
|
116
|
+
/** Change earning validator */
|
|
117
|
+
abstract handleChangeEarningValidator(data: SubmitChangeValidatorStaking): Promise<TransactionData>;
|
|
116
118
|
/** Check handler can handle slug */
|
|
117
119
|
canHandleSlug(slug: string): boolean;
|
|
118
120
|
getEarningSlippage(params: RequestEarningSlippage): Promise<EarningSlippageResult>;
|
|
@@ -11,7 +11,7 @@ export default class InterlayLendingPoolHandler extends BaseLendingPoolHandler {
|
|
|
11
11
|
protected readonly inputAsset: string;
|
|
12
12
|
protected readonly rewardAssets: string[];
|
|
13
13
|
protected readonly feeAssets: string[];
|
|
14
|
-
|
|
14
|
+
readonly availableMethod: YieldPoolMethodInfo;
|
|
15
15
|
protected readonly rateDecimals = 18;
|
|
16
16
|
constructor(state: KoniState, chain: string);
|
|
17
17
|
protected getDescription(): string;
|
|
@@ -20,7 +20,8 @@ export default class InterlayLendingPoolHandler extends BaseLendingPoolHandler {
|
|
|
20
20
|
fastUnstake: true,
|
|
21
21
|
cancelUnstake: false,
|
|
22
22
|
withdraw: false,
|
|
23
|
-
claimReward: false
|
|
23
|
+
claimReward: false,
|
|
24
|
+
changeValidator: false
|
|
24
25
|
};
|
|
25
26
|
rateDecimals = 18;
|
|
26
27
|
constructor(state, chain) {
|
|
@@ -12,7 +12,7 @@ export default class AcalaLiquidStakingPoolHandler extends BaseLiquidStakingPool
|
|
|
12
12
|
protected readonly feeAssets: string[];
|
|
13
13
|
readonly minAmountPercent = 0.98;
|
|
14
14
|
protected readonly rateDecimals = 10;
|
|
15
|
-
|
|
15
|
+
readonly availableMethod: YieldPoolMethodInfo;
|
|
16
16
|
slug: string;
|
|
17
17
|
constructor(state: KoniState, chain: string);
|
|
18
18
|
protected getDescription(): string;
|
|
@@ -27,7 +27,8 @@ export default class AcalaLiquidStakingPoolHandler extends BaseLiquidStakingPool
|
|
|
27
27
|
fastUnstake: true,
|
|
28
28
|
cancelUnstake: false,
|
|
29
29
|
withdraw: true,
|
|
30
|
-
claimReward: false
|
|
30
|
+
claimReward: false,
|
|
31
|
+
changeValidator: false
|
|
31
32
|
};
|
|
32
33
|
constructor(state, chain) {
|
|
33
34
|
super(state, chain);
|
|
@@ -32,7 +32,7 @@ export default class BifrostLiquidStakingPoolHandler extends BaseLiquidStakingPo
|
|
|
32
32
|
protected readonly rewardAssets: string[];
|
|
33
33
|
protected readonly feeAssets: string[];
|
|
34
34
|
readonly minAmountPercent: number;
|
|
35
|
-
|
|
35
|
+
readonly availableMethod: YieldPoolMethodInfo;
|
|
36
36
|
protected readonly rateDecimals = 0;
|
|
37
37
|
constructor(state: KoniState, chain: string);
|
|
38
38
|
protected getDescription(): string;
|
|
@@ -26,7 +26,8 @@ export default class BifrostLiquidStakingPoolHandler extends BaseLiquidStakingPo
|
|
|
26
26
|
fastUnstake: true,
|
|
27
27
|
cancelUnstake: false,
|
|
28
28
|
withdraw: false,
|
|
29
|
-
claimReward: false
|
|
29
|
+
claimReward: false,
|
|
30
|
+
changeValidator: false
|
|
30
31
|
};
|
|
31
32
|
rateDecimals = 0;
|
|
32
33
|
constructor(state, chain) {
|
|
@@ -13,7 +13,7 @@ export default class ParallelLiquidStakingPoolHandler extends BaseLiquidStakingP
|
|
|
13
13
|
protected readonly feeAssets: string[];
|
|
14
14
|
readonly minAmountPercent = 0.96;
|
|
15
15
|
protected readonly rateDecimals = 18;
|
|
16
|
-
|
|
16
|
+
readonly availableMethod: YieldPoolMethodInfo;
|
|
17
17
|
constructor(state: KoniState, chain: string);
|
|
18
18
|
protected getDescription(): string;
|
|
19
19
|
getPoolStat(): Promise<LiquidYieldPoolInfo>;
|
|
@@ -22,7 +22,8 @@ export default class ParallelLiquidStakingPoolHandler extends BaseLiquidStakingP
|
|
|
22
22
|
fastUnstake: true,
|
|
23
23
|
cancelUnstake: false,
|
|
24
24
|
withdraw: false,
|
|
25
|
-
claimReward: false
|
|
25
|
+
claimReward: false,
|
|
26
|
+
changeValidator: false
|
|
26
27
|
};
|
|
27
28
|
constructor(state, chain) {
|
|
28
29
|
super(state, chain);
|