@subwallet/extension-base 1.3.48-2 → 1.3.50-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/staking.js +4 -2
- package/cjs/core/utils.js +14 -5
- package/cjs/koni/background/handlers/Extension.js +3 -2
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/earning-service/constants/chains.js +6 -1
- package/cjs/services/earning-service/handlers/base.js +14 -0
- package/cjs/services/earning-service/handlers/native-staking/amplitude.js +9 -7
- package/cjs/services/earning-service/handlers/native-staking/base.js +2 -0
- package/cjs/services/earning-service/handlers/native-staking/para-chain.js +6 -3
- package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +5 -3
- package/cjs/services/earning-service/service.js +96 -7
- package/cjs/services/swap-service/handler/chainflip-handler.js +5 -3
- package/cjs/utils/account/transform.js +7 -11
- package/constants/staking.d.ts +1 -0
- package/constants/staking.js +2 -1
- package/core/utils.js +14 -5
- package/koni/background/handlers/Extension.js +3 -2
- package/package.json +6 -6
- package/packageInfo.js +1 -1
- package/services/earning-service/constants/chains.d.ts +1 -0
- package/services/earning-service/constants/chains.js +4 -0
- package/services/earning-service/handlers/base.d.ts +3 -0
- package/services/earning-service/handlers/base.js +15 -1
- package/services/earning-service/handlers/native-staking/amplitude.d.ts +2 -2
- package/services/earning-service/handlers/native-staking/amplitude.js +9 -7
- package/services/earning-service/handlers/native-staking/base.js +2 -0
- package/services/earning-service/handlers/native-staking/para-chain.js +6 -3
- package/services/earning-service/handlers/native-staking/relay-chain.js +5 -3
- package/services/earning-service/service.d.ts +4 -0
- package/services/earning-service/service.js +94 -6
- package/services/swap-service/handler/chainflip-handler.js +6 -4
- package/types/swap/index.d.ts +2 -0
- package/utils/account/transform.js +7 -11
package/cjs/constants/staking.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.PREDEFINED_STAKING_POOL = exports.PREDEFINED_EARNING_POOL_PROMISE = exports.MAX_NOMINATIONS = void 0;
|
|
6
|
+
exports.PREDEFINED_STAKING_POOL = exports.PREDEFINED_EARNING_POOL_PROMISE = exports.MAX_NOMINATIONS = exports.CRON_REFRESH_EARNING_TARGETS = void 0;
|
|
7
7
|
var _utils = require("@subwallet/extension-base/utils");
|
|
8
8
|
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
9
9
|
// SPDX-License-Identifier: Apache-2.0
|
|
@@ -19,4 +19,6 @@ exports.PREDEFINED_STAKING_POOL = PREDEFINED_STAKING_POOL;
|
|
|
19
19
|
const MAX_NOMINATIONS = '16';
|
|
20
20
|
exports.MAX_NOMINATIONS = MAX_NOMINATIONS;
|
|
21
21
|
const PREDEFINED_EARNING_POOL_PROMISE = (0, _utils.fetchStaticData)('nomination-pool-recommendation');
|
|
22
|
-
exports.PREDEFINED_EARNING_POOL_PROMISE = PREDEFINED_EARNING_POOL_PROMISE;
|
|
22
|
+
exports.PREDEFINED_EARNING_POOL_PROMISE = PREDEFINED_EARNING_POOL_PROMISE;
|
|
23
|
+
const CRON_REFRESH_EARNING_TARGETS = 10 * 60 * 1000; // 10 minutes depends on cron run time on server
|
|
24
|
+
exports.CRON_REFRESH_EARNING_TARGETS = CRON_REFRESH_EARNING_TARGETS;
|
package/cjs/core/utils.js
CHANGED
|
@@ -44,11 +44,14 @@ function getMaxBigInt(a, b) {
|
|
|
44
44
|
return a > b ? a : b;
|
|
45
45
|
}
|
|
46
46
|
function ledgerMustCheckNetwork(account) {
|
|
47
|
-
if (account && account.isHardware && account.isGeneric
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
if (account && account.isHardware && account.isGeneric) {
|
|
48
|
+
if (!(0, _utilCrypto.isEthereumAddress)(account.address)) {
|
|
49
|
+
return account.originGenesisHash ? 'migration' : 'polkadot';
|
|
50
|
+
} else if (account.isSubstrateECDSA) {
|
|
51
|
+
return 'polkadot_ecdsa';
|
|
52
|
+
}
|
|
51
53
|
}
|
|
54
|
+
return 'unnecessary';
|
|
52
55
|
}
|
|
53
56
|
|
|
54
57
|
// --- recipient address validation --- //
|
|
@@ -179,7 +182,13 @@ function _isSupportLedgerAccount(validateRecipientParams) {
|
|
|
179
182
|
// For ledger generic
|
|
180
183
|
const ledgerCheck = ledgerMustCheckNetwork(account);
|
|
181
184
|
if (ledgerCheck !== 'unnecessary' && !allowLedgerGenerics.includes(destChainInfo.slug)) {
|
|
182
|
-
|
|
185
|
+
let ledgerTypeLabel = 'Migration';
|
|
186
|
+
if (ledgerCheck === 'polkadot') {
|
|
187
|
+
ledgerTypeLabel = 'Polkadot';
|
|
188
|
+
} else if (ledgerCheck === 'polkadot_ecdsa') {
|
|
189
|
+
ledgerTypeLabel = 'Polkadot (EVM)';
|
|
190
|
+
}
|
|
191
|
+
return `Ledger ${ledgerTypeLabel} address is not supported for this transfer`;
|
|
183
192
|
}
|
|
184
193
|
}
|
|
185
194
|
}
|
|
@@ -2082,16 +2082,17 @@ class KoniExtension {
|
|
|
2082
2082
|
async validateERC721Token(data) {
|
|
2083
2083
|
var _data$metadata;
|
|
2084
2084
|
const evmApi = this.#koniState.getEvmApi(data.originChain);
|
|
2085
|
+
const contractAddress = (_data$metadata = data.metadata) === null || _data$metadata === void 0 ? void 0 : _data$metadata.contractAddress;
|
|
2085
2086
|
|
|
2086
2087
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
2087
|
-
const tokenContract = new evmApi.api.eth.Contract(_utils2._ERC721_ABI,
|
|
2088
|
+
const tokenContract = new evmApi.api.eth.Contract(_utils2._ERC721_ABI, contractAddress);
|
|
2088
2089
|
try {
|
|
2089
2090
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
|
|
2090
2091
|
await tokenContract.methods.tokenOfOwnerByIndex('0xB7fdD27a8Df011816205a6e3cAA097DC4D8C2C5d', 1).call();
|
|
2091
2092
|
return true;
|
|
2092
2093
|
} catch (err) {
|
|
2093
2094
|
const error = err;
|
|
2094
|
-
if (error.message.includes('
|
|
2095
|
+
if (error.message.includes('index out of bounds')) {
|
|
2095
2096
|
return true;
|
|
2096
2097
|
} else {
|
|
2097
2098
|
return false;
|
package/cjs/packageInfo.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports._SUPPORT_CHANGE_VALIDATOR_CHAIN = exports._STAKING_CHAIN_GROUP = exports.TON_CHAINS = exports.ST_LIQUID_TOKEN_ABI = exports.MaxEraRewardPointsEras = exports.MANTA_VALIDATOR_POINTS_PER_BLOCK = exports.MANTA_MIN_DELEGATION = exports.CHANNEL_ID = void 0;
|
|
6
|
+
exports._SUPPORT_CHANGE_VALIDATOR_CHAIN = exports._STAKING_CHAIN_GROUP = exports.TON_CHAINS = exports.ST_LIQUID_TOKEN_ABI = exports.STAKING_IDENTITY_API_SLUG = exports.MaxEraRewardPointsEras = exports.MANTA_VALIDATOR_POINTS_PER_BLOCK = exports.MANTA_MIN_DELEGATION = exports.CHANNEL_ID = void 0;
|
|
7
7
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
8
8
|
// SPDX-License-Identifier: Apache-2.0
|
|
9
9
|
|
|
@@ -42,5 +42,10 @@ const MANTA_MIN_DELEGATION = 500;
|
|
|
42
42
|
exports.MANTA_MIN_DELEGATION = MANTA_MIN_DELEGATION;
|
|
43
43
|
const CHANNEL_ID = 7;
|
|
44
44
|
exports.CHANNEL_ID = CHANNEL_ID;
|
|
45
|
+
const STAKING_IDENTITY_API_SLUG = {
|
|
46
|
+
polkadot: 'polkadot_people',
|
|
47
|
+
kusama: 'peopleKusama'
|
|
48
|
+
};
|
|
49
|
+
exports.STAKING_IDENTITY_API_SLUG = STAKING_IDENTITY_API_SLUG;
|
|
45
50
|
const _SUPPORT_CHANGE_VALIDATOR_CHAIN = ['polkadot', 'kusama'];
|
|
46
51
|
exports._SUPPORT_CHANGE_VALIDATOR_CHAIN = _SUPPORT_CHANGE_VALIDATOR_CHAIN;
|
|
@@ -37,6 +37,9 @@ class BasePoolHandler {
|
|
|
37
37
|
|
|
38
38
|
/** Pool's available method */
|
|
39
39
|
|
|
40
|
+
/** Whether the pool can override identity of validator */
|
|
41
|
+
canOverrideIdentity = false;
|
|
42
|
+
|
|
40
43
|
/**
|
|
41
44
|
* @constructor
|
|
42
45
|
* @param {KoniState} state - Koni state
|
|
@@ -60,6 +63,17 @@ class BasePoolHandler {
|
|
|
60
63
|
get substrateApi() {
|
|
61
64
|
return this.state.getSubstrateApi(this.chain);
|
|
62
65
|
}
|
|
66
|
+
get substrateIdentityApi() {
|
|
67
|
+
const otherChainSupported = _constants2.STAKING_IDENTITY_API_SLUG[this.chain];
|
|
68
|
+
if (otherChainSupported) {
|
|
69
|
+
const api = this.state.getSubstrateApi(otherChainSupported) || this.substrateApi;
|
|
70
|
+
if (api.isApiReady && api.isApiConnected) {
|
|
71
|
+
return api;
|
|
72
|
+
}
|
|
73
|
+
return this.substrateApi;
|
|
74
|
+
}
|
|
75
|
+
return this.substrateApi;
|
|
76
|
+
}
|
|
63
77
|
get evmApi() {
|
|
64
78
|
return this.state.getEvmApi(this.chain);
|
|
65
79
|
}
|
|
@@ -118,7 +118,8 @@ class AmplitudeNativeStakingPoolHandler extends _basePara.default {
|
|
|
118
118
|
let unstakingBalance = '0';
|
|
119
119
|
if (delegatorState) {
|
|
120
120
|
// delegatorState can be null while unstaking all
|
|
121
|
-
const
|
|
121
|
+
const substrateIdentityApi = this.substrateIdentityApi;
|
|
122
|
+
const identityPromises = delegatorState.map(delegate => (0, _utils2.parseIdentity)(substrateIdentityApi, delegate.owner));
|
|
122
123
|
const identities = await Promise.all(identityPromises);
|
|
123
124
|
for (let i = 0; i < delegatorState.length; i++) {
|
|
124
125
|
const delegate = delegatorState[i];
|
|
@@ -309,7 +310,7 @@ class AmplitudeNativeStakingPoolHandler extends _basePara.default {
|
|
|
309
310
|
|
|
310
311
|
/* Get pool targets */
|
|
311
312
|
|
|
312
|
-
async getKrestPoolTargets(chainApi) {
|
|
313
|
+
async getKrestPoolTargets(chainApi, chainIdentityApi) {
|
|
313
314
|
var _chainApi$api$consts$;
|
|
314
315
|
const _allCollators = await chainApi.api.query.parachainStaking.candidatePool.entries();
|
|
315
316
|
const minDelegatorStake = chainApi.api.consts.parachainStaking.minDelegatorStake.toString();
|
|
@@ -317,7 +318,7 @@ class AmplitudeNativeStakingPoolHandler extends _basePara.default {
|
|
|
317
318
|
const identityPromises = _allCollators.map(collator => {
|
|
318
319
|
const collatorInfo = collator[1].toPrimitive();
|
|
319
320
|
const address = collatorInfo.id;
|
|
320
|
-
return (0, _utils2.parseIdentity)(
|
|
321
|
+
return (0, _utils2.parseIdentity)(chainIdentityApi, address);
|
|
321
322
|
});
|
|
322
323
|
const identities = await Promise.all(identityPromises);
|
|
323
324
|
return _allCollators.map((_collator, i) => {
|
|
@@ -350,7 +351,7 @@ class AmplitudeNativeStakingPoolHandler extends _basePara.default {
|
|
|
350
351
|
};
|
|
351
352
|
});
|
|
352
353
|
}
|
|
353
|
-
async getOtherPoolTargets(chainApi) {
|
|
354
|
+
async getOtherPoolTargets(chainApi, chainIdentityApi) {
|
|
354
355
|
const [_allCollators, _inflationConfig] = await Promise.all([chainApi.api.query.parachainStaking.candidatePool.entries(), chainApi.api.query.parachainStaking.inflationConfig()]);
|
|
355
356
|
const minDelegatorStake = chainApi.api.consts.parachainStaking.minDelegatorStake.toString();
|
|
356
357
|
const maxDelegatorsPerCollator = chainApi.api.consts.parachainStaking.maxDelegatorsPerCollator.toString();
|
|
@@ -360,7 +361,7 @@ class AmplitudeNativeStakingPoolHandler extends _basePara.default {
|
|
|
360
361
|
const identityPromises = _allCollators.map(collator => {
|
|
361
362
|
const collatorInfo = collator[1].toPrimitive();
|
|
362
363
|
const address = collatorInfo.id;
|
|
363
|
-
return (0, _utils2.parseIdentity)(
|
|
364
|
+
return (0, _utils2.parseIdentity)(chainIdentityApi, address);
|
|
364
365
|
});
|
|
365
366
|
const identities = await Promise.all(identityPromises);
|
|
366
367
|
return _allCollators.map((_collator, i) => {
|
|
@@ -396,10 +397,11 @@ class AmplitudeNativeStakingPoolHandler extends _basePara.default {
|
|
|
396
397
|
}
|
|
397
398
|
async getPoolTargets() {
|
|
398
399
|
const chainApi = await this.substrateApi.isReady;
|
|
400
|
+
const chainIdentityApi = this.substrateIdentityApi;
|
|
399
401
|
if (_constants2._STAKING_CHAIN_GROUP.krest_network.includes(this.chain)) {
|
|
400
|
-
return this.getKrestPoolTargets(chainApi);
|
|
402
|
+
return this.getKrestPoolTargets(chainApi, chainIdentityApi);
|
|
401
403
|
} else {
|
|
402
|
-
return this.getOtherPoolTargets(chainApi);
|
|
404
|
+
return this.getOtherPoolTargets(chainApi, chainIdentityApi);
|
|
403
405
|
}
|
|
404
406
|
}
|
|
405
407
|
|
|
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
exports.default = void 0;
|
|
8
8
|
var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
|
|
9
9
|
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
10
|
+
var _constants = require("@subwallet/extension-base/services/earning-service/constants");
|
|
10
11
|
var _types = require("@subwallet/extension-base/types");
|
|
11
12
|
var _util = require("@polkadot/util");
|
|
12
13
|
var _base = _interopRequireDefault(require("../base"));
|
|
@@ -35,6 +36,7 @@ class BaseNativeStakingPoolHandler extends _base.default {
|
|
|
35
36
|
this.slug = `${symbol}___native_staking___${_chainInfo.slug}`;
|
|
36
37
|
this.name = `${_chainInfo.name} Native Staking`;
|
|
37
38
|
this.shortName = _chainInfo.name.replaceAll(' Relay Chain', '');
|
|
39
|
+
this.canOverrideIdentity = !!_constants.STAKING_IDENTITY_API_SLUG[chain];
|
|
38
40
|
}
|
|
39
41
|
getDescription() {
|
|
40
42
|
let amount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '0';
|
|
@@ -141,6 +141,7 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
|
|
|
141
141
|
async parseNominatorMetadata(chainInfo, address, substrateApi, delegatorState) {
|
|
142
142
|
const nominationList = [];
|
|
143
143
|
const unstakingMap = {};
|
|
144
|
+
const substrateIdentityApi = this.substrateIdentityApi;
|
|
144
145
|
let bnTotalActiveStake = _util.BN_ZERO;
|
|
145
146
|
let bnTotalStake = _util.BN_ZERO;
|
|
146
147
|
let bnTotalUnstaking = _util.BN_ZERO;
|
|
@@ -148,7 +149,7 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
|
|
|
148
149
|
const roundInfo = _roundInfo.toPrimitive();
|
|
149
150
|
const currentRound = roundInfo.current;
|
|
150
151
|
await Promise.all(delegatorState.delegations.map(async delegation => {
|
|
151
|
-
const [_delegationScheduledRequests, [identity], _collatorInfo, _currentBlock, _currentTimestamp] = await Promise.all([substrateApi.api.query.parachainStaking.delegationScheduledRequests(delegation.owner), (0, _utils2.parseIdentity)(
|
|
152
|
+
const [_delegationScheduledRequests, [identity], _collatorInfo, _currentBlock, _currentTimestamp] = await Promise.all([substrateApi.api.query.parachainStaking.delegationScheduledRequests(delegation.owner), (0, _utils2.parseIdentity)(substrateIdentityApi, delegation.owner), substrateApi.api.query.parachainStaking.candidateInfo(delegation.owner), substrateApi.api.query.system.number(), substrateApi.api.query.timestamp.now()]);
|
|
152
153
|
const currentBlock = _currentBlock.toPrimitive();
|
|
153
154
|
const currentTimestamp = _currentTimestamp.toPrimitive();
|
|
154
155
|
const collatorInfo = _collatorInfo.toPrimitive();
|
|
@@ -299,6 +300,7 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
|
|
|
299
300
|
async getMantaPoolTargets() {
|
|
300
301
|
var _this$chainInfo$subst;
|
|
301
302
|
const apiProps = await this.substrateApi.isReady;
|
|
303
|
+
const substrateIdentityApi = this.substrateIdentityApi;
|
|
302
304
|
const allCollators = [];
|
|
303
305
|
const DECIMAL = (_this$chainInfo$subst = this.chainInfo.substrateInfo) === null || _this$chainInfo$subst === void 0 ? void 0 : _this$chainInfo$subst.decimals;
|
|
304
306
|
const POINTS_PER_BLOCK = _constants2.MANTA_VALIDATOR_POINTS_PER_BLOCK; // producing 1 block will get 20 points for validator
|
|
@@ -358,7 +360,7 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
|
|
|
358
360
|
}));
|
|
359
361
|
const extraInfoMap = {};
|
|
360
362
|
await Promise.all(allCollators.map(async collator => {
|
|
361
|
-
const [_info, [identity, isReasonable]] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo(collator.address), (0, _utils2.parseIdentity)(
|
|
363
|
+
const [_info, [identity, isReasonable]] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo(collator.address), (0, _utils2.parseIdentity)(substrateIdentityApi, collator.address)]);
|
|
362
364
|
const rawInfo = _info.toHuman();
|
|
363
365
|
const active = (rawInfo === null || rawInfo === void 0 ? void 0 : rawInfo.status) === 'Active';
|
|
364
366
|
extraInfoMap[collator.address] = {
|
|
@@ -378,6 +380,7 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
|
|
|
378
380
|
}
|
|
379
381
|
async getParachainPoolTargets() {
|
|
380
382
|
const apiProps = await this.substrateApi.isReady;
|
|
383
|
+
const substrateIdentityApi = this.substrateIdentityApi;
|
|
381
384
|
const allCollators = [];
|
|
382
385
|
const [_allCollators, _collatorCommission, _selectedCandidates] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo.entries(), apiProps.api.query.parachainStaking.collatorCommission(), apiProps.api.query.parachainStaking.selectedCandidates()]);
|
|
383
386
|
const maxDelegationPerCollator = apiProps.api.consts.parachainStaking.maxTopDelegationsPerCandidate.toString();
|
|
@@ -412,7 +415,7 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
|
|
|
412
415
|
}
|
|
413
416
|
const extraInfoMap = {};
|
|
414
417
|
await Promise.all(allCollators.map(async collator => {
|
|
415
|
-
const [_info, [identity, isReasonable]] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo(collator.address), (0, _utils2.parseIdentity)(
|
|
418
|
+
const [_info, [identity, isReasonable]] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo(collator.address), (0, _utils2.parseIdentity)(substrateIdentityApi, collator.address)]);
|
|
416
419
|
const rawInfo = _info.toHuman();
|
|
417
420
|
const active = (rawInfo === null || rawInfo === void 0 ? void 0 : rawInfo.status) === 'Active';
|
|
418
421
|
extraInfoMap[collator.address] = {
|
|
@@ -214,6 +214,7 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
214
214
|
if (!nominations) {
|
|
215
215
|
return [];
|
|
216
216
|
}
|
|
217
|
+
const substrateIdentityApi = this.substrateIdentityApi;
|
|
217
218
|
const validatorList = nominations.targets;
|
|
218
219
|
await Promise.all(validatorList.map(async validatorAddress => {
|
|
219
220
|
let nominationStatus = _types.EarningStatus.NOT_EARNING;
|
|
@@ -221,11 +222,11 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
221
222
|
let identity;
|
|
222
223
|
if (substrateApi.api.query.staking.erasStakersPaged) {
|
|
223
224
|
// todo: review all relaychains later
|
|
224
|
-
const [[_identity], _eraStaker] = await Promise.all([(0, _utils3.parseIdentity)(
|
|
225
|
+
const [[_identity], _eraStaker] = await Promise.all([(0, _utils3.parseIdentity)(substrateIdentityApi, validatorAddress), substrateApi.api.query.staking.erasStakersPaged.entries(currentEra, validatorAddress)]);
|
|
225
226
|
identity = _identity;
|
|
226
227
|
eraStakerOtherList = _eraStaker.flatMap(paged => paged[1].toPrimitive().others);
|
|
227
228
|
} else {
|
|
228
|
-
const [[_identity], _eraStaker] = await Promise.all([(0, _utils3.parseIdentity)(
|
|
229
|
+
const [[_identity], _eraStaker] = await Promise.all([(0, _utils3.parseIdentity)(substrateIdentityApi, validatorAddress), substrateApi.api.query.staking.erasStakers(currentEra, validatorAddress)]);
|
|
229
230
|
identity = _identity;
|
|
230
231
|
const eraStaker = _eraStaker.toPrimitive();
|
|
231
232
|
eraStakerOtherList = eraStaker.others;
|
|
@@ -332,6 +333,7 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
332
333
|
async getPoolTargets() {
|
|
333
334
|
var _chainApi$api$query$s;
|
|
334
335
|
const chainApi = await this.substrateApi.isReady;
|
|
336
|
+
const substrateIdentityApi = this.substrateIdentityApi;
|
|
335
337
|
const poolInfo = await this.getPoolInfo();
|
|
336
338
|
if (!poolInfo || !poolInfo.statistic) {
|
|
337
339
|
return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INTERNAL_ERROR));
|
|
@@ -375,7 +377,7 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
375
377
|
const extraInfoMap = {};
|
|
376
378
|
await Promise.all(allValidatorAddresses.map(async address => {
|
|
377
379
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
378
|
-
const [_commissionInfo, [identity, isVerified]] = await Promise.all([chainApi.api.query.staking.validators(address), (0, _utils3.parseIdentity)(
|
|
380
|
+
const [_commissionInfo, [identity, isVerified]] = await Promise.all([chainApi.api.query.staking.validators(address), (0, _utils3.parseIdentity)(substrateIdentityApi, address)]);
|
|
379
381
|
const commissionInfo = _commissionInfo.toHuman();
|
|
380
382
|
extraInfoMap[address] = {
|
|
381
383
|
commission: commissionInfo.commission,
|
|
@@ -37,6 +37,7 @@ class EarningService {
|
|
|
37
37
|
});
|
|
38
38
|
earningRewardHistorySubject = new _rxjs.BehaviorSubject({});
|
|
39
39
|
minAmountPercentSubject = new _rxjs.BehaviorSubject({});
|
|
40
|
+
poolTargetsFetchingCached = new _rxjs.BehaviorSubject({});
|
|
40
41
|
|
|
41
42
|
// earning
|
|
42
43
|
yieldPoolInfoSubject = new _rxjs.BehaviorSubject({});
|
|
@@ -155,12 +156,39 @@ class EarningService {
|
|
|
155
156
|
await this.loadData();
|
|
156
157
|
|
|
157
158
|
// Pin list with value from map
|
|
158
|
-
|
|
159
|
-
|
|
159
|
+
(0, _rxjs.combineLatest)({
|
|
160
|
+
poolTarget: this.poolTargetsFetchingCached,
|
|
161
|
+
yieldPositionInfo: this.yieldPositionSubject
|
|
162
|
+
}).subscribe({
|
|
163
|
+
next: _ref => {
|
|
164
|
+
let {
|
|
165
|
+
poolTarget,
|
|
166
|
+
yieldPositionInfo
|
|
167
|
+
} = _ref;
|
|
160
168
|
const activeMap = this.state.getActiveChainInfoMap();
|
|
161
|
-
const activePositions = Object.values(
|
|
169
|
+
const activePositions = Object.values(yieldPositionInfo).filter(item => {
|
|
162
170
|
return !!activeMap[item.chain] && !this.inactivePoolSlug.has(item.slug);
|
|
163
171
|
});
|
|
172
|
+
if (this.useOnlineCacheOnly) {
|
|
173
|
+
activePositions.forEach(item => {
|
|
174
|
+
const handler = this.getPoolHandler(item.slug);
|
|
175
|
+
if (handler !== null && handler !== void 0 && handler.canOverrideIdentity) {
|
|
176
|
+
const hasValidatorIdentity = item.nominations.some(validator => !!validator.validatorIdentity);
|
|
177
|
+
if (!hasValidatorIdentity) {
|
|
178
|
+
const validatorTargetRecord = poolTarget[item.slug];
|
|
179
|
+
if (validatorTargetRecord && Object.keys(validatorTargetRecord).length) {
|
|
180
|
+
item.nominations = item.nominations.map(validator => {
|
|
181
|
+
var _validatorTargetRecor;
|
|
182
|
+
return {
|
|
183
|
+
...validator,
|
|
184
|
+
validatorIdentity: ((_validatorTargetRecor = validatorTargetRecord[validator.validatorAddress]) === null || _validatorTargetRecor === void 0 ? void 0 : _validatorTargetRecor.identity) || validator.validatorIdentity
|
|
185
|
+
};
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
164
192
|
this.yieldPositionListSubject.next(Object.values(activePositions));
|
|
165
193
|
}
|
|
166
194
|
});
|
|
@@ -245,6 +273,11 @@ class EarningService {
|
|
|
245
273
|
// Start subscribe pools' reward history
|
|
246
274
|
this.runSubscribeEarningRewardHistoryInterval();
|
|
247
275
|
|
|
276
|
+
// cache identities of validators in native staking
|
|
277
|
+
if (this.useOnlineCacheOnly && !this.validatorInfoCachingInterval) {
|
|
278
|
+
this.runIntervalGetPoolTargets().catch(console.error);
|
|
279
|
+
}
|
|
280
|
+
|
|
248
281
|
// Update promise handler
|
|
249
282
|
this.startPromiseHandler.resolve();
|
|
250
283
|
this.stopPromiseHandler = (0, _utils2.createPromiseHandler)();
|
|
@@ -272,6 +305,12 @@ class EarningService {
|
|
|
272
305
|
// Stop subscribe pools' reward history
|
|
273
306
|
this.runUnsubscribeEarningRewardHistoryInterval();
|
|
274
307
|
|
|
308
|
+
// clear interval cache identities of validators in native staking
|
|
309
|
+
if (this.useOnlineCacheOnly && this.validatorInfoCachingInterval) {
|
|
310
|
+
clearInterval(this.validatorInfoCachingInterval);
|
|
311
|
+
this.validatorInfoCachingInterval = undefined;
|
|
312
|
+
}
|
|
313
|
+
|
|
275
314
|
// Update promise handler
|
|
276
315
|
this.stopPromiseHandler.resolve();
|
|
277
316
|
this.startPromiseHandler = (0, _utils2.createPromiseHandler)();
|
|
@@ -454,14 +493,14 @@ class EarningService {
|
|
|
454
493
|
}
|
|
455
494
|
async removeYieldPositions(chains, addresses) {
|
|
456
495
|
const removeKeys = [];
|
|
457
|
-
chains && chains.length > 0 && Object.entries(this.yieldPositionSubject.getValue()).forEach(
|
|
458
|
-
let [key, value] =
|
|
496
|
+
chains && chains.length > 0 && Object.entries(this.yieldPositionSubject.getValue()).forEach(_ref2 => {
|
|
497
|
+
let [key, value] = _ref2;
|
|
459
498
|
if (chains.indexOf(value.chain) > -1 && !removeKeys.includes(key)) {
|
|
460
499
|
removeKeys.push(key);
|
|
461
500
|
}
|
|
462
501
|
});
|
|
463
|
-
addresses && addresses.length > 0 && Object.entries(this.yieldPositionSubject.getValue()).forEach(
|
|
464
|
-
let [key, value] =
|
|
502
|
+
addresses && addresses.length > 0 && Object.entries(this.yieldPositionSubject.getValue()).forEach(_ref3 => {
|
|
503
|
+
let [key, value] = _ref3;
|
|
465
504
|
if (addresses.indexOf(value.address) > -1 && !removeKeys.includes(key)) {
|
|
466
505
|
removeKeys.push(key);
|
|
467
506
|
}
|
|
@@ -740,6 +779,56 @@ class EarningService {
|
|
|
740
779
|
}
|
|
741
780
|
return targets;
|
|
742
781
|
}
|
|
782
|
+
async getPoolTargetsToCached(slug) {
|
|
783
|
+
try {
|
|
784
|
+
const poolTargets = await this.getPoolTargets(slug);
|
|
785
|
+
if (poolTargets.length) {
|
|
786
|
+
const newData = poolTargets.reduce((record, target) => {
|
|
787
|
+
record[target.address] = target;
|
|
788
|
+
return record;
|
|
789
|
+
}, {});
|
|
790
|
+
return {
|
|
791
|
+
...newData
|
|
792
|
+
};
|
|
793
|
+
}
|
|
794
|
+
} catch (e) {
|
|
795
|
+
console.error(e);
|
|
796
|
+
}
|
|
797
|
+
const prevValueCached = this.poolTargetsFetchingCached.getValue();
|
|
798
|
+
return {
|
|
799
|
+
...prevValueCached[slug]
|
|
800
|
+
};
|
|
801
|
+
}
|
|
802
|
+
async runIntervalGetPoolTargets() {
|
|
803
|
+
let poolInfosSubjectValue = {
|
|
804
|
+
...this.yieldPoolInfoSubject.getValue()
|
|
805
|
+
};
|
|
806
|
+
if (!Object.keys(poolInfosSubjectValue).length) {
|
|
807
|
+
try {
|
|
808
|
+
poolInfosSubjectValue = await fetchPoolsData();
|
|
809
|
+
} catch (e) {
|
|
810
|
+
console.log('Error fetching pools data:', e);
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
const poolNeedUpdateIdentityValidators = Object.values(poolInfosSubjectValue).reduce((list, pool) => {
|
|
814
|
+
if (pool.type === _types2.YieldPoolType.NATIVE_STAKING && _constants2.STAKING_IDENTITY_API_SLUG[pool.chain]) {
|
|
815
|
+
list.push(pool.slug);
|
|
816
|
+
}
|
|
817
|
+
return list;
|
|
818
|
+
}, []);
|
|
819
|
+
const updatePoolTarget = () => {
|
|
820
|
+
Promise.all(poolNeedUpdateIdentityValidators.map(slug => this.getPoolTargetsToCached(slug))).then(data => {
|
|
821
|
+
const poolTargetsFetchingCached = this.poolTargetsFetchingCached.getValue();
|
|
822
|
+
data.forEach((targets, index) => {
|
|
823
|
+
const slug = poolNeedUpdateIdentityValidators[index];
|
|
824
|
+
poolTargetsFetchingCached[slug] = targets;
|
|
825
|
+
});
|
|
826
|
+
this.poolTargetsFetchingCached.next(poolTargetsFetchingCached);
|
|
827
|
+
}).catch(console.error);
|
|
828
|
+
};
|
|
829
|
+
updatePoolTarget();
|
|
830
|
+
this.validatorInfoCachingInterval = setInterval(updatePoolTarget, _constants.CRON_REFRESH_EARNING_TARGETS);
|
|
831
|
+
}
|
|
743
832
|
|
|
744
833
|
/* Get pool's targets */
|
|
745
834
|
|
|
@@ -72,16 +72,15 @@ class ChainflipSwapHandler {
|
|
|
72
72
|
} = params;
|
|
73
73
|
const pair = quote.pair;
|
|
74
74
|
const fromAsset = this.chainService.getAssetBySlug(pair.from);
|
|
75
|
-
const toAsset = this.chainService.getAssetBySlug(pair.to);
|
|
76
75
|
const chainInfo = this.chainService.getChainInfoByKey(fromAsset.originChain);
|
|
77
76
|
const toChainInfo = this.chainService.getChainInfoByKey(fromAsset.originChain);
|
|
78
77
|
const chainType = (0, _utils._isChainSubstrateCompatible)(chainInfo) ? _KoniTypes.ChainType.SUBSTRATE : _KoniTypes.ChainType.EVM;
|
|
79
78
|
const receiver = (0, _utils2._reformatAddressWithChain)(recipient !== null && recipient !== void 0 ? recipient : address, toChainInfo);
|
|
80
|
-
const fromAssetId = (0, _utils._getAssetSymbol)(fromAsset);
|
|
81
|
-
const toAssetId = (0, _utils._getAssetSymbol)(toAsset);
|
|
82
79
|
const minReceive = new _bignumber.default(quote.rate).times(1 - slippage).toString();
|
|
83
80
|
const processMetadata = params.process.steps[params.currentStep].metadata;
|
|
84
81
|
const quoteMetadata = processMetadata;
|
|
82
|
+
const fromAssetId = quoteMetadata.fromAssetId;
|
|
83
|
+
const toAssetId = quoteMetadata.toAssetId;
|
|
85
84
|
if (!processMetadata || !quoteMetadata) {
|
|
86
85
|
throw new Error('Metadata for Chainflip not found');
|
|
87
86
|
}
|
|
@@ -114,6 +113,7 @@ class ChainflipSwapHandler {
|
|
|
114
113
|
method: 'GET'
|
|
115
114
|
}, this.isTestnet);
|
|
116
115
|
const data = await response.json();
|
|
116
|
+
console.log('Chainflip channel info:', data);
|
|
117
117
|
if (!data.id || !data.address || data.address === '' || !data.issuedBlock || !data.network || !data.channelId) {
|
|
118
118
|
throw new Error('Error get Chainflip data');
|
|
119
119
|
}
|
|
@@ -223,6 +223,8 @@ class ChainflipSwapHandler {
|
|
|
223
223
|
receiver: (0, _utils2._reformatAddressWithChain)(params.request.recipient || params.request.address, destinationChain),
|
|
224
224
|
srcChain: metadata.srcChain,
|
|
225
225
|
destChain: metadata.destChain,
|
|
226
|
+
fromAssetId: metadata.fromAssetId,
|
|
227
|
+
toAssetId: metadata.toAssetId,
|
|
226
228
|
version: 2
|
|
227
229
|
}
|
|
228
230
|
};
|
|
@@ -195,9 +195,7 @@ const getAccountTransactionActions = (signMode, networkType, type, _meta, _speci
|
|
|
195
195
|
} else if (signMode === _types2.AccountSignMode.GENERIC_LEDGER) {
|
|
196
196
|
switch (networkType) {
|
|
197
197
|
case _types2.AccountChainType.SUBSTRATE:
|
|
198
|
-
return [...BASE_TRANSFER_ACTIONS, ...NATIVE_STAKE_ACTIONS, ...POOL_STAKE_ACTIONS, ...EARN_VDOT_ACTIONS, ...EARN_VMANTA_ACTIONS,
|
|
199
|
-
// ...EARN_LDOT_ACTIONS,
|
|
200
|
-
// ...EARN_SDOT_ACTIONS,
|
|
198
|
+
return [...BASE_TRANSFER_ACTIONS, ...NATIVE_STAKE_ACTIONS, ...POOL_STAKE_ACTIONS, ...EARN_VDOT_ACTIONS, ...EARN_VMANTA_ACTIONS, ...EARN_LDOT_ACTIONS, ...EARN_SDOT_ACTIONS,
|
|
201
199
|
// ...EARN_QDOT_ACTIONS,
|
|
202
200
|
...OTHER_ACTIONS];
|
|
203
201
|
case _types2.AccountChainType.ETHEREUM:
|
|
@@ -226,14 +224,12 @@ const getAccountTransactionActions = (signMode, networkType, type, _meta, _speci
|
|
|
226
224
|
if (specialNetwork === 'bifrost') {
|
|
227
225
|
result.push(...EARN_VDOT_ACTIONS, ...EARN_VMANTA_ACTIONS);
|
|
228
226
|
}
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
// result.push(...EARN_SDOT_ACTIONS);
|
|
236
|
-
// }
|
|
227
|
+
if (specialNetwork === 'acala') {
|
|
228
|
+
result.push(...EARN_LDOT_ACTIONS);
|
|
229
|
+
}
|
|
230
|
+
if (specialNetwork === 'parallel') {
|
|
231
|
+
result.push(...EARN_SDOT_ACTIONS);
|
|
232
|
+
}
|
|
237
233
|
|
|
238
234
|
// if (specialNetwork === 'interlay') {
|
|
239
235
|
// result.push(...EARN_QDOT_ACTIONS);
|
package/constants/staking.d.ts
CHANGED
package/constants/staking.js
CHANGED
|
@@ -10,4 +10,5 @@ export const PREDEFINED_STAKING_POOL = {
|
|
|
10
10
|
availTuringTest: 11
|
|
11
11
|
};
|
|
12
12
|
export const MAX_NOMINATIONS = '16';
|
|
13
|
-
export const PREDEFINED_EARNING_POOL_PROMISE = fetchStaticData('nomination-pool-recommendation');
|
|
13
|
+
export const PREDEFINED_EARNING_POOL_PROMISE = fetchStaticData('nomination-pool-recommendation');
|
|
14
|
+
export const CRON_REFRESH_EARNING_TARGETS = 10 * 60 * 1000; // 10 minutes depends on cron run time on server
|
package/core/utils.js
CHANGED
|
@@ -25,11 +25,14 @@ export function getMaxBigInt(a, b) {
|
|
|
25
25
|
return a > b ? a : b;
|
|
26
26
|
}
|
|
27
27
|
export function ledgerMustCheckNetwork(account) {
|
|
28
|
-
if (account && account.isHardware && account.isGeneric
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
if (account && account.isHardware && account.isGeneric) {
|
|
29
|
+
if (!isEthereumAddress(account.address)) {
|
|
30
|
+
return account.originGenesisHash ? 'migration' : 'polkadot';
|
|
31
|
+
} else if (account.isSubstrateECDSA) {
|
|
32
|
+
return 'polkadot_ecdsa';
|
|
33
|
+
}
|
|
32
34
|
}
|
|
35
|
+
return 'unnecessary';
|
|
33
36
|
}
|
|
34
37
|
|
|
35
38
|
// --- recipient address validation --- //
|
|
@@ -160,7 +163,13 @@ export function _isSupportLedgerAccount(validateRecipientParams) {
|
|
|
160
163
|
// For ledger generic
|
|
161
164
|
const ledgerCheck = ledgerMustCheckNetwork(account);
|
|
162
165
|
if (ledgerCheck !== 'unnecessary' && !allowLedgerGenerics.includes(destChainInfo.slug)) {
|
|
163
|
-
|
|
166
|
+
let ledgerTypeLabel = 'Migration';
|
|
167
|
+
if (ledgerCheck === 'polkadot') {
|
|
168
|
+
ledgerTypeLabel = 'Polkadot';
|
|
169
|
+
} else if (ledgerCheck === 'polkadot_ecdsa') {
|
|
170
|
+
ledgerTypeLabel = 'Polkadot (EVM)';
|
|
171
|
+
}
|
|
172
|
+
return `Ledger ${ledgerTypeLabel} address is not supported for this transfer`;
|
|
164
173
|
}
|
|
165
174
|
}
|
|
166
175
|
}
|
|
@@ -2027,16 +2027,17 @@ export default class KoniExtension {
|
|
|
2027
2027
|
async validateERC721Token(data) {
|
|
2028
2028
|
var _data$metadata;
|
|
2029
2029
|
const evmApi = this.#koniState.getEvmApi(data.originChain);
|
|
2030
|
+
const contractAddress = (_data$metadata = data.metadata) === null || _data$metadata === void 0 ? void 0 : _data$metadata.contractAddress;
|
|
2030
2031
|
|
|
2031
2032
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
2032
|
-
const tokenContract = new evmApi.api.eth.Contract(_ERC721_ABI,
|
|
2033
|
+
const tokenContract = new evmApi.api.eth.Contract(_ERC721_ABI, contractAddress);
|
|
2033
2034
|
try {
|
|
2034
2035
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
|
|
2035
2036
|
await tokenContract.methods.tokenOfOwnerByIndex('0xB7fdD27a8Df011816205a6e3cAA097DC4D8C2C5d', 1).call();
|
|
2036
2037
|
return true;
|
|
2037
2038
|
} catch (err) {
|
|
2038
2039
|
const error = err;
|
|
2039
|
-
if (error.message.includes('
|
|
2040
|
+
if (error.message.includes('index out of bounds')) {
|
|
2040
2041
|
return true;
|
|
2041
2042
|
} else {
|
|
2042
2043
|
return false;
|
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.50-0",
|
|
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.110",
|
|
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.50-0",
|
|
2870
|
+
"@subwallet/extension-chains": "^1.3.50-0",
|
|
2871
|
+
"@subwallet/extension-dapp": "^1.3.50-0",
|
|
2872
|
+
"@subwallet/extension-inject": "^1.3.50-0",
|
|
2873
2873
|
"@subwallet/keyring": "^0.1.12",
|
|
2874
|
-
"@subwallet/subwallet-api-sdk": "^1.3.
|
|
2874
|
+
"@subwallet/subwallet-api-sdk": "^1.3.50-0",
|
|
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.50-0'
|
|
11
11
|
};
|
|
@@ -22,4 +22,5 @@ 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 STAKING_IDENTITY_API_SLUG: Record<string, string>;
|
|
25
26
|
export declare const _SUPPORT_CHANGE_VALIDATOR_CHAIN: string[];
|
|
@@ -29,4 +29,8 @@ 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
31
|
export const CHANNEL_ID = 7;
|
|
32
|
+
export const STAKING_IDENTITY_API_SLUG = {
|
|
33
|
+
polkadot: 'polkadot_people',
|
|
34
|
+
kusama: 'peopleKusama'
|
|
35
|
+
};
|
|
32
36
|
export const _SUPPORT_CHANGE_VALIDATOR_CHAIN = ['polkadot', 'kusama'];
|
|
@@ -28,6 +28,8 @@ export default abstract class BasePoolHandler {
|
|
|
28
28
|
readonly transactionChainType: ChainType;
|
|
29
29
|
/** Pool's available method */
|
|
30
30
|
abstract readonly availableMethod: YieldPoolMethodInfo;
|
|
31
|
+
/** Whether the pool can override identity of validator */
|
|
32
|
+
canOverrideIdentity: boolean;
|
|
31
33
|
/**
|
|
32
34
|
* @constructor
|
|
33
35
|
* @param {KoniState} state - Koni state
|
|
@@ -38,6 +40,7 @@ export default abstract class BasePoolHandler {
|
|
|
38
40
|
get group(): string;
|
|
39
41
|
get isActive(): boolean;
|
|
40
42
|
protected get substrateApi(): _SubstrateApi;
|
|
43
|
+
protected get substrateIdentityApi(): _SubstrateApi;
|
|
41
44
|
protected get evmApi(): _EvmApi;
|
|
42
45
|
get chainInfo(): _ChainInfo;
|
|
43
46
|
protected get nativeToken(): _ChainAsset;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
import { ChainType } from '@subwallet/extension-base/background/KoniTypes';
|
|
5
5
|
import { ALL_ACCOUNT_KEY } from '@subwallet/extension-base/constants';
|
|
6
|
-
import { DEFAULT_YIELD_FIRST_STEP } from '@subwallet/extension-base/services/earning-service/constants';
|
|
6
|
+
import { DEFAULT_YIELD_FIRST_STEP, STAKING_IDENTITY_API_SLUG } from '@subwallet/extension-base/services/earning-service/constants';
|
|
7
7
|
import { createClaimNotification, createWithdrawNotifications } from '@subwallet/extension-base/services/inapp-notification-service/utils';
|
|
8
8
|
import { formatNumber, reformatAddress } from '@subwallet/extension-base/utils';
|
|
9
9
|
import { BN, BN_TEN } from '@polkadot/util';
|
|
@@ -31,6 +31,9 @@ export default class BasePoolHandler {
|
|
|
31
31
|
|
|
32
32
|
/** Pool's available method */
|
|
33
33
|
|
|
34
|
+
/** Whether the pool can override identity of validator */
|
|
35
|
+
canOverrideIdentity = false;
|
|
36
|
+
|
|
34
37
|
/**
|
|
35
38
|
* @constructor
|
|
36
39
|
* @param {KoniState} state - Koni state
|
|
@@ -54,6 +57,17 @@ export default class BasePoolHandler {
|
|
|
54
57
|
get substrateApi() {
|
|
55
58
|
return this.state.getSubstrateApi(this.chain);
|
|
56
59
|
}
|
|
60
|
+
get substrateIdentityApi() {
|
|
61
|
+
const otherChainSupported = STAKING_IDENTITY_API_SLUG[this.chain];
|
|
62
|
+
if (otherChainSupported) {
|
|
63
|
+
const api = this.state.getSubstrateApi(otherChainSupported) || this.substrateApi;
|
|
64
|
+
if (api.isApiReady && api.isApiConnected) {
|
|
65
|
+
return api;
|
|
66
|
+
}
|
|
67
|
+
return this.substrateApi;
|
|
68
|
+
}
|
|
69
|
+
return this.substrateApi;
|
|
70
|
+
}
|
|
57
71
|
get evmApi() {
|
|
58
72
|
return this.state.getEvmApi(this.chain);
|
|
59
73
|
}
|
|
@@ -10,8 +10,8 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
|
|
|
10
10
|
checkAccountHaveStake(useAddresses: string[]): Promise<string[]>;
|
|
11
11
|
subscribePoolPosition(useAddresses: string[], resultCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
|
|
12
12
|
getPoolReward(useAddresses: string[], callBack: (rs: EarningRewardItem) => void): Promise<VoidFunction>;
|
|
13
|
-
getKrestPoolTargets(chainApi: _SubstrateApi): Promise<ValidatorInfo[]>;
|
|
14
|
-
getOtherPoolTargets(chainApi: _SubstrateApi): Promise<ValidatorInfo[]>;
|
|
13
|
+
getKrestPoolTargets(chainApi: _SubstrateApi, chainIdentityApi: _SubstrateApi): Promise<ValidatorInfo[]>;
|
|
14
|
+
getOtherPoolTargets(chainApi: _SubstrateApi, chainIdentityApi: _SubstrateApi): Promise<ValidatorInfo[]>;
|
|
15
15
|
getPoolTargets(): Promise<ValidatorInfo[]>;
|
|
16
16
|
get defaultSubmitStep(): YieldStepBaseInfo;
|
|
17
17
|
createJoinExtrinsic(data: SubmitJoinNativeStaking, positionInfo?: YieldPositionInfo, bondDest?: string): Promise<[TransactionData, YieldTokenBaseInfo]>;
|
|
@@ -111,7 +111,8 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
|
|
|
111
111
|
let unstakingBalance = '0';
|
|
112
112
|
if (delegatorState) {
|
|
113
113
|
// delegatorState can be null while unstaking all
|
|
114
|
-
const
|
|
114
|
+
const substrateIdentityApi = this.substrateIdentityApi;
|
|
115
|
+
const identityPromises = delegatorState.map(delegate => parseIdentity(substrateIdentityApi, delegate.owner));
|
|
115
116
|
const identities = await Promise.all(identityPromises);
|
|
116
117
|
for (let i = 0; i < delegatorState.length; i++) {
|
|
117
118
|
const delegate = delegatorState[i];
|
|
@@ -302,7 +303,7 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
|
|
|
302
303
|
|
|
303
304
|
/* Get pool targets */
|
|
304
305
|
|
|
305
|
-
async getKrestPoolTargets(chainApi) {
|
|
306
|
+
async getKrestPoolTargets(chainApi, chainIdentityApi) {
|
|
306
307
|
var _chainApi$api$consts$;
|
|
307
308
|
const _allCollators = await chainApi.api.query.parachainStaking.candidatePool.entries();
|
|
308
309
|
const minDelegatorStake = chainApi.api.consts.parachainStaking.minDelegatorStake.toString();
|
|
@@ -310,7 +311,7 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
|
|
|
310
311
|
const identityPromises = _allCollators.map(collator => {
|
|
311
312
|
const collatorInfo = collator[1].toPrimitive();
|
|
312
313
|
const address = collatorInfo.id;
|
|
313
|
-
return parseIdentity(
|
|
314
|
+
return parseIdentity(chainIdentityApi, address);
|
|
314
315
|
});
|
|
315
316
|
const identities = await Promise.all(identityPromises);
|
|
316
317
|
return _allCollators.map((_collator, i) => {
|
|
@@ -343,7 +344,7 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
|
|
|
343
344
|
};
|
|
344
345
|
});
|
|
345
346
|
}
|
|
346
|
-
async getOtherPoolTargets(chainApi) {
|
|
347
|
+
async getOtherPoolTargets(chainApi, chainIdentityApi) {
|
|
347
348
|
const [_allCollators, _inflationConfig] = await Promise.all([chainApi.api.query.parachainStaking.candidatePool.entries(), chainApi.api.query.parachainStaking.inflationConfig()]);
|
|
348
349
|
const minDelegatorStake = chainApi.api.consts.parachainStaking.minDelegatorStake.toString();
|
|
349
350
|
const maxDelegatorsPerCollator = chainApi.api.consts.parachainStaking.maxDelegatorsPerCollator.toString();
|
|
@@ -353,7 +354,7 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
|
|
|
353
354
|
const identityPromises = _allCollators.map(collator => {
|
|
354
355
|
const collatorInfo = collator[1].toPrimitive();
|
|
355
356
|
const address = collatorInfo.id;
|
|
356
|
-
return parseIdentity(
|
|
357
|
+
return parseIdentity(chainIdentityApi, address);
|
|
357
358
|
});
|
|
358
359
|
const identities = await Promise.all(identityPromises);
|
|
359
360
|
return _allCollators.map((_collator, i) => {
|
|
@@ -389,10 +390,11 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
|
|
|
389
390
|
}
|
|
390
391
|
async getPoolTargets() {
|
|
391
392
|
const chainApi = await this.substrateApi.isReady;
|
|
393
|
+
const chainIdentityApi = this.substrateIdentityApi;
|
|
392
394
|
if (_STAKING_CHAIN_GROUP.krest_network.includes(this.chain)) {
|
|
393
|
-
return this.getKrestPoolTargets(chainApi);
|
|
395
|
+
return this.getKrestPoolTargets(chainApi, chainIdentityApi);
|
|
394
396
|
} else {
|
|
395
|
-
return this.getOtherPoolTargets(chainApi);
|
|
397
|
+
return this.getOtherPoolTargets(chainApi, chainIdentityApi);
|
|
396
398
|
}
|
|
397
399
|
}
|
|
398
400
|
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
|
|
5
5
|
import { ChainType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
|
|
6
|
+
import { STAKING_IDENTITY_API_SLUG } from '@subwallet/extension-base/services/earning-service/constants';
|
|
6
7
|
import { BasicTxErrorType, YieldPoolType, YieldStepType } from '@subwallet/extension-base/types';
|
|
7
8
|
import { noop } from '@polkadot/util';
|
|
8
9
|
import BasePoolHandler from "../base.js";
|
|
@@ -28,6 +29,7 @@ export default class BaseNativeStakingPoolHandler extends BasePoolHandler {
|
|
|
28
29
|
this.slug = `${symbol}___native_staking___${_chainInfo.slug}`;
|
|
29
30
|
this.name = `${_chainInfo.name} Native Staking`;
|
|
30
31
|
this.shortName = _chainInfo.name.replaceAll(' Relay Chain', '');
|
|
32
|
+
this.canOverrideIdentity = !!STAKING_IDENTITY_API_SLUG[chain];
|
|
31
33
|
}
|
|
32
34
|
getDescription(amount = '0') {
|
|
33
35
|
const _chainAsset = this.nativeToken;
|
|
@@ -134,6 +134,7 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
|
|
|
134
134
|
async parseNominatorMetadata(chainInfo, address, substrateApi, delegatorState) {
|
|
135
135
|
const nominationList = [];
|
|
136
136
|
const unstakingMap = {};
|
|
137
|
+
const substrateIdentityApi = this.substrateIdentityApi;
|
|
137
138
|
let bnTotalActiveStake = BN_ZERO;
|
|
138
139
|
let bnTotalStake = BN_ZERO;
|
|
139
140
|
let bnTotalUnstaking = BN_ZERO;
|
|
@@ -141,7 +142,7 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
|
|
|
141
142
|
const roundInfo = _roundInfo.toPrimitive();
|
|
142
143
|
const currentRound = roundInfo.current;
|
|
143
144
|
await Promise.all(delegatorState.delegations.map(async delegation => {
|
|
144
|
-
const [_delegationScheduledRequests, [identity], _collatorInfo, _currentBlock, _currentTimestamp] = await Promise.all([substrateApi.api.query.parachainStaking.delegationScheduledRequests(delegation.owner), parseIdentity(
|
|
145
|
+
const [_delegationScheduledRequests, [identity], _collatorInfo, _currentBlock, _currentTimestamp] = await Promise.all([substrateApi.api.query.parachainStaking.delegationScheduledRequests(delegation.owner), parseIdentity(substrateIdentityApi, delegation.owner), substrateApi.api.query.parachainStaking.candidateInfo(delegation.owner), substrateApi.api.query.system.number(), substrateApi.api.query.timestamp.now()]);
|
|
145
146
|
const currentBlock = _currentBlock.toPrimitive();
|
|
146
147
|
const currentTimestamp = _currentTimestamp.toPrimitive();
|
|
147
148
|
const collatorInfo = _collatorInfo.toPrimitive();
|
|
@@ -292,6 +293,7 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
|
|
|
292
293
|
async getMantaPoolTargets() {
|
|
293
294
|
var _this$chainInfo$subst;
|
|
294
295
|
const apiProps = await this.substrateApi.isReady;
|
|
296
|
+
const substrateIdentityApi = this.substrateIdentityApi;
|
|
295
297
|
const allCollators = [];
|
|
296
298
|
const DECIMAL = (_this$chainInfo$subst = this.chainInfo.substrateInfo) === null || _this$chainInfo$subst === void 0 ? void 0 : _this$chainInfo$subst.decimals;
|
|
297
299
|
const POINTS_PER_BLOCK = MANTA_VALIDATOR_POINTS_PER_BLOCK; // producing 1 block will get 20 points for validator
|
|
@@ -351,7 +353,7 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
|
|
|
351
353
|
}));
|
|
352
354
|
const extraInfoMap = {};
|
|
353
355
|
await Promise.all(allCollators.map(async collator => {
|
|
354
|
-
const [_info, [identity, isReasonable]] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo(collator.address), parseIdentity(
|
|
356
|
+
const [_info, [identity, isReasonable]] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo(collator.address), parseIdentity(substrateIdentityApi, collator.address)]);
|
|
355
357
|
const rawInfo = _info.toHuman();
|
|
356
358
|
const active = (rawInfo === null || rawInfo === void 0 ? void 0 : rawInfo.status) === 'Active';
|
|
357
359
|
extraInfoMap[collator.address] = {
|
|
@@ -371,6 +373,7 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
|
|
|
371
373
|
}
|
|
372
374
|
async getParachainPoolTargets() {
|
|
373
375
|
const apiProps = await this.substrateApi.isReady;
|
|
376
|
+
const substrateIdentityApi = this.substrateIdentityApi;
|
|
374
377
|
const allCollators = [];
|
|
375
378
|
const [_allCollators, _collatorCommission, _selectedCandidates] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo.entries(), apiProps.api.query.parachainStaking.collatorCommission(), apiProps.api.query.parachainStaking.selectedCandidates()]);
|
|
376
379
|
const maxDelegationPerCollator = apiProps.api.consts.parachainStaking.maxTopDelegationsPerCandidate.toString();
|
|
@@ -405,7 +408,7 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
|
|
|
405
408
|
}
|
|
406
409
|
const extraInfoMap = {};
|
|
407
410
|
await Promise.all(allCollators.map(async collator => {
|
|
408
|
-
const [_info, [identity, isReasonable]] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo(collator.address), parseIdentity(
|
|
411
|
+
const [_info, [identity, isReasonable]] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo(collator.address), parseIdentity(substrateIdentityApi, collator.address)]);
|
|
409
412
|
const rawInfo = _info.toHuman();
|
|
410
413
|
const active = (rawInfo === null || rawInfo === void 0 ? void 0 : rawInfo.status) === 'Active';
|
|
411
414
|
extraInfoMap[collator.address] = {
|
|
@@ -207,6 +207,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
207
207
|
if (!nominations) {
|
|
208
208
|
return [];
|
|
209
209
|
}
|
|
210
|
+
const substrateIdentityApi = this.substrateIdentityApi;
|
|
210
211
|
const validatorList = nominations.targets;
|
|
211
212
|
await Promise.all(validatorList.map(async validatorAddress => {
|
|
212
213
|
let nominationStatus = EarningStatus.NOT_EARNING;
|
|
@@ -214,11 +215,11 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
214
215
|
let identity;
|
|
215
216
|
if (substrateApi.api.query.staking.erasStakersPaged) {
|
|
216
217
|
// todo: review all relaychains later
|
|
217
|
-
const [[_identity], _eraStaker] = await Promise.all([parseIdentity(
|
|
218
|
+
const [[_identity], _eraStaker] = await Promise.all([parseIdentity(substrateIdentityApi, validatorAddress), substrateApi.api.query.staking.erasStakersPaged.entries(currentEra, validatorAddress)]);
|
|
218
219
|
identity = _identity;
|
|
219
220
|
eraStakerOtherList = _eraStaker.flatMap(paged => paged[1].toPrimitive().others);
|
|
220
221
|
} else {
|
|
221
|
-
const [[_identity], _eraStaker] = await Promise.all([parseIdentity(
|
|
222
|
+
const [[_identity], _eraStaker] = await Promise.all([parseIdentity(substrateIdentityApi, validatorAddress), substrateApi.api.query.staking.erasStakers(currentEra, validatorAddress)]);
|
|
222
223
|
identity = _identity;
|
|
223
224
|
const eraStaker = _eraStaker.toPrimitive();
|
|
224
225
|
eraStakerOtherList = eraStaker.others;
|
|
@@ -325,6 +326,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
325
326
|
async getPoolTargets() {
|
|
326
327
|
var _chainApi$api$query$s;
|
|
327
328
|
const chainApi = await this.substrateApi.isReady;
|
|
329
|
+
const substrateIdentityApi = this.substrateIdentityApi;
|
|
328
330
|
const poolInfo = await this.getPoolInfo();
|
|
329
331
|
if (!poolInfo || !poolInfo.statistic) {
|
|
330
332
|
return Promise.reject(new TransactionError(BasicTxErrorType.INTERNAL_ERROR));
|
|
@@ -368,7 +370,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
368
370
|
const extraInfoMap = {};
|
|
369
371
|
await Promise.all(allValidatorAddresses.map(async address => {
|
|
370
372
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
371
|
-
const [_commissionInfo, [identity, isVerified]] = await Promise.all([chainApi.api.query.staking.validators(address), parseIdentity(
|
|
373
|
+
const [_commissionInfo, [identity, isVerified]] = await Promise.all([chainApi.api.query.staking.validators(address), parseIdentity(substrateIdentityApi, address)]);
|
|
372
374
|
const commissionInfo = _commissionInfo.toHuman();
|
|
373
375
|
extraInfoMap[address] = {
|
|
374
376
|
commission: commissionInfo.commission,
|
|
@@ -16,12 +16,14 @@ export default class EarningService implements StoppableServiceInterface, Persis
|
|
|
16
16
|
private earningRewardSubject;
|
|
17
17
|
private earningRewardHistorySubject;
|
|
18
18
|
private minAmountPercentSubject;
|
|
19
|
+
private poolTargetsFetchingCached;
|
|
19
20
|
readonly yieldPoolInfoSubject: BehaviorSubject<Record<string, YieldPoolInfo>>;
|
|
20
21
|
readonly yieldPositionSubject: BehaviorSubject<Record<string, YieldPositionInfo>>;
|
|
21
22
|
readonly yieldPositionListSubject: BehaviorSubject<YieldPositionInfo[]>;
|
|
22
23
|
private dbService;
|
|
23
24
|
private eventService;
|
|
24
25
|
private useOnlineCacheOnly;
|
|
26
|
+
private validatorInfoCachingInterval;
|
|
25
27
|
private inactivePoolReady;
|
|
26
28
|
constructor(state: KoniState);
|
|
27
29
|
disableOnlineCacheOnly(): void;
|
|
@@ -93,6 +95,8 @@ export default class EarningService implements StoppableServiceInterface, Persis
|
|
|
93
95
|
* @return {Promise<YieldPoolTarget[]>} List of pool's target
|
|
94
96
|
* */
|
|
95
97
|
getPoolTargets(slug: string): Promise<YieldPoolTarget[]>;
|
|
98
|
+
getPoolTargetsToCached(slug: string): Promise<Record<string, YieldPoolTarget>>;
|
|
99
|
+
private runIntervalGetPoolTargets;
|
|
96
100
|
earlyValidateJoin(request: RequestEarlyValidateYield): Promise<ResponseEarlyValidateYield>;
|
|
97
101
|
generateOptimalSteps(params: OptimalYieldPathParams): Promise<OptimalYieldPath>;
|
|
98
102
|
validateYieldJoin(params: ValidateYieldProcessParams): Promise<TransactionError[]>;
|
|
@@ -3,16 +3,16 @@
|
|
|
3
3
|
|
|
4
4
|
import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
|
|
5
5
|
import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
|
|
6
|
-
import { CRON_REFRESH_CHAIN_STAKING_METADATA, CRON_REFRESH_EARNING_REWARD_HISTORY_INTERVAL, CRON_REFRESH_STAKING_REWARD_FAST_INTERVAL } from '@subwallet/extension-base/constants';
|
|
6
|
+
import { CRON_REFRESH_CHAIN_STAKING_METADATA, CRON_REFRESH_EARNING_REWARD_HISTORY_INTERVAL, CRON_REFRESH_EARNING_TARGETS, CRON_REFRESH_STAKING_REWARD_FAST_INTERVAL } from '@subwallet/extension-base/constants';
|
|
7
7
|
import { ServiceStatus } from '@subwallet/extension-base/services/base/types';
|
|
8
8
|
import { _getChainSubstrateTokenSymbol, _isChainEnabled } from '@subwallet/extension-base/services/chain-service/utils';
|
|
9
|
-
import { _STAKING_CHAIN_GROUP } from '@subwallet/extension-base/services/earning-service/constants';
|
|
9
|
+
import { _STAKING_CHAIN_GROUP, STAKING_IDENTITY_API_SLUG } from '@subwallet/extension-base/services/earning-service/constants';
|
|
10
10
|
import BaseLiquidStakingPoolHandler from '@subwallet/extension-base/services/earning-service/handlers/liquid-staking/base';
|
|
11
11
|
import MythosNativeStakingPoolHandler from '@subwallet/extension-base/services/earning-service/handlers/native-staking/mythos';
|
|
12
12
|
import { BasicTxErrorType, YieldPoolType } from '@subwallet/extension-base/types';
|
|
13
13
|
import { addLazy, createPromiseHandler, filterAddressByChainInfo, removeLazy } from '@subwallet/extension-base/utils';
|
|
14
14
|
import { fetchStaticCache } from '@subwallet/extension-base/utils/fetchStaticCache';
|
|
15
|
-
import { BehaviorSubject } from 'rxjs';
|
|
15
|
+
import { BehaviorSubject, combineLatest } from 'rxjs';
|
|
16
16
|
import { AcalaLiquidStakingPoolHandler, AmplitudeNativeStakingPoolHandler, AstarNativeStakingPoolHandler, BifrostLiquidStakingPoolHandler, BifrostMantaLiquidStakingPoolHandler, InterlayLendingPoolHandler, NominationPoolHandler, ParallelLiquidStakingPoolHandler, ParaNativeStakingPoolHandler, RelayNativeStakingPoolHandler, StellaSwapLiquidStakingPoolHandler, SubnetTaoStakingPoolHandler, TaoNativeStakingPoolHandler } from "./handlers/index.js";
|
|
17
17
|
const fetchPoolsData = async () => {
|
|
18
18
|
const fetchData = await fetchStaticCache('earning/yield-pools.json', {
|
|
@@ -30,6 +30,7 @@ export default class EarningService {
|
|
|
30
30
|
});
|
|
31
31
|
earningRewardHistorySubject = new BehaviorSubject({});
|
|
32
32
|
minAmountPercentSubject = new BehaviorSubject({});
|
|
33
|
+
poolTargetsFetchingCached = new BehaviorSubject({});
|
|
33
34
|
|
|
34
35
|
// earning
|
|
35
36
|
yieldPoolInfoSubject = new BehaviorSubject({});
|
|
@@ -148,12 +149,38 @@ export default class EarningService {
|
|
|
148
149
|
await this.loadData();
|
|
149
150
|
|
|
150
151
|
// Pin list with value from map
|
|
151
|
-
|
|
152
|
-
|
|
152
|
+
combineLatest({
|
|
153
|
+
poolTarget: this.poolTargetsFetchingCached,
|
|
154
|
+
yieldPositionInfo: this.yieldPositionSubject
|
|
155
|
+
}).subscribe({
|
|
156
|
+
next: ({
|
|
157
|
+
poolTarget,
|
|
158
|
+
yieldPositionInfo
|
|
159
|
+
}) => {
|
|
153
160
|
const activeMap = this.state.getActiveChainInfoMap();
|
|
154
|
-
const activePositions = Object.values(
|
|
161
|
+
const activePositions = Object.values(yieldPositionInfo).filter(item => {
|
|
155
162
|
return !!activeMap[item.chain] && !this.inactivePoolSlug.has(item.slug);
|
|
156
163
|
});
|
|
164
|
+
if (this.useOnlineCacheOnly) {
|
|
165
|
+
activePositions.forEach(item => {
|
|
166
|
+
const handler = this.getPoolHandler(item.slug);
|
|
167
|
+
if (handler !== null && handler !== void 0 && handler.canOverrideIdentity) {
|
|
168
|
+
const hasValidatorIdentity = item.nominations.some(validator => !!validator.validatorIdentity);
|
|
169
|
+
if (!hasValidatorIdentity) {
|
|
170
|
+
const validatorTargetRecord = poolTarget[item.slug];
|
|
171
|
+
if (validatorTargetRecord && Object.keys(validatorTargetRecord).length) {
|
|
172
|
+
item.nominations = item.nominations.map(validator => {
|
|
173
|
+
var _validatorTargetRecor;
|
|
174
|
+
return {
|
|
175
|
+
...validator,
|
|
176
|
+
validatorIdentity: ((_validatorTargetRecor = validatorTargetRecord[validator.validatorAddress]) === null || _validatorTargetRecor === void 0 ? void 0 : _validatorTargetRecor.identity) || validator.validatorIdentity
|
|
177
|
+
};
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
}
|
|
157
184
|
this.yieldPositionListSubject.next(Object.values(activePositions));
|
|
158
185
|
}
|
|
159
186
|
});
|
|
@@ -238,6 +265,11 @@ export default class EarningService {
|
|
|
238
265
|
// Start subscribe pools' reward history
|
|
239
266
|
this.runSubscribeEarningRewardHistoryInterval();
|
|
240
267
|
|
|
268
|
+
// cache identities of validators in native staking
|
|
269
|
+
if (this.useOnlineCacheOnly && !this.validatorInfoCachingInterval) {
|
|
270
|
+
this.runIntervalGetPoolTargets().catch(console.error);
|
|
271
|
+
}
|
|
272
|
+
|
|
241
273
|
// Update promise handler
|
|
242
274
|
this.startPromiseHandler.resolve();
|
|
243
275
|
this.stopPromiseHandler = createPromiseHandler();
|
|
@@ -265,6 +297,12 @@ export default class EarningService {
|
|
|
265
297
|
// Stop subscribe pools' reward history
|
|
266
298
|
this.runUnsubscribeEarningRewardHistoryInterval();
|
|
267
299
|
|
|
300
|
+
// clear interval cache identities of validators in native staking
|
|
301
|
+
if (this.useOnlineCacheOnly && this.validatorInfoCachingInterval) {
|
|
302
|
+
clearInterval(this.validatorInfoCachingInterval);
|
|
303
|
+
this.validatorInfoCachingInterval = undefined;
|
|
304
|
+
}
|
|
305
|
+
|
|
268
306
|
// Update promise handler
|
|
269
307
|
this.stopPromiseHandler.resolve();
|
|
270
308
|
this.startPromiseHandler = createPromiseHandler();
|
|
@@ -730,6 +768,56 @@ export default class EarningService {
|
|
|
730
768
|
}
|
|
731
769
|
return targets;
|
|
732
770
|
}
|
|
771
|
+
async getPoolTargetsToCached(slug) {
|
|
772
|
+
try {
|
|
773
|
+
const poolTargets = await this.getPoolTargets(slug);
|
|
774
|
+
if (poolTargets.length) {
|
|
775
|
+
const newData = poolTargets.reduce((record, target) => {
|
|
776
|
+
record[target.address] = target;
|
|
777
|
+
return record;
|
|
778
|
+
}, {});
|
|
779
|
+
return {
|
|
780
|
+
...newData
|
|
781
|
+
};
|
|
782
|
+
}
|
|
783
|
+
} catch (e) {
|
|
784
|
+
console.error(e);
|
|
785
|
+
}
|
|
786
|
+
const prevValueCached = this.poolTargetsFetchingCached.getValue();
|
|
787
|
+
return {
|
|
788
|
+
...prevValueCached[slug]
|
|
789
|
+
};
|
|
790
|
+
}
|
|
791
|
+
async runIntervalGetPoolTargets() {
|
|
792
|
+
let poolInfosSubjectValue = {
|
|
793
|
+
...this.yieldPoolInfoSubject.getValue()
|
|
794
|
+
};
|
|
795
|
+
if (!Object.keys(poolInfosSubjectValue).length) {
|
|
796
|
+
try {
|
|
797
|
+
poolInfosSubjectValue = await fetchPoolsData();
|
|
798
|
+
} catch (e) {
|
|
799
|
+
console.log('Error fetching pools data:', e);
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
const poolNeedUpdateIdentityValidators = Object.values(poolInfosSubjectValue).reduce((list, pool) => {
|
|
803
|
+
if (pool.type === YieldPoolType.NATIVE_STAKING && STAKING_IDENTITY_API_SLUG[pool.chain]) {
|
|
804
|
+
list.push(pool.slug);
|
|
805
|
+
}
|
|
806
|
+
return list;
|
|
807
|
+
}, []);
|
|
808
|
+
const updatePoolTarget = () => {
|
|
809
|
+
Promise.all(poolNeedUpdateIdentityValidators.map(slug => this.getPoolTargetsToCached(slug))).then(data => {
|
|
810
|
+
const poolTargetsFetchingCached = this.poolTargetsFetchingCached.getValue();
|
|
811
|
+
data.forEach((targets, index) => {
|
|
812
|
+
const slug = poolNeedUpdateIdentityValidators[index];
|
|
813
|
+
poolTargetsFetchingCached[slug] = targets;
|
|
814
|
+
});
|
|
815
|
+
this.poolTargetsFetchingCached.next(poolTargetsFetchingCached);
|
|
816
|
+
}).catch(console.error);
|
|
817
|
+
};
|
|
818
|
+
updatePoolTarget();
|
|
819
|
+
this.validatorInfoCachingInterval = setInterval(updatePoolTarget, CRON_REFRESH_EARNING_TARGETS);
|
|
820
|
+
}
|
|
733
821
|
|
|
734
822
|
/* Get pool's targets */
|
|
735
823
|
|
|
@@ -6,7 +6,7 @@ import { TransactionError } from '@subwallet/extension-base/background/errors/Tr
|
|
|
6
6
|
import { ChainType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
|
|
7
7
|
import { getERC20TransactionObject, getEVMTransactionObject } from '@subwallet/extension-base/services/balance-service/transfer/smart-contract';
|
|
8
8
|
import { createSubstrateExtrinsic } from '@subwallet/extension-base/services/balance-service/transfer/token';
|
|
9
|
-
import {
|
|
9
|
+
import { _getContractAddressOfToken, _isChainSubstrateCompatible, _isNativeToken } from '@subwallet/extension-base/services/chain-service/utils';
|
|
10
10
|
import { SwapBaseHandler } from '@subwallet/extension-base/services/swap-service/handler/base-handler';
|
|
11
11
|
import { BasicTxErrorType, CommonStepType, DynamicSwapType, SwapProviderId, SwapStepType } from '@subwallet/extension-base/types';
|
|
12
12
|
import { ProxyServiceRoute } from '@subwallet/extension-base/types/environment';
|
|
@@ -64,16 +64,15 @@ export class ChainflipSwapHandler {
|
|
|
64
64
|
} = params;
|
|
65
65
|
const pair = quote.pair;
|
|
66
66
|
const fromAsset = this.chainService.getAssetBySlug(pair.from);
|
|
67
|
-
const toAsset = this.chainService.getAssetBySlug(pair.to);
|
|
68
67
|
const chainInfo = this.chainService.getChainInfoByKey(fromAsset.originChain);
|
|
69
68
|
const toChainInfo = this.chainService.getChainInfoByKey(fromAsset.originChain);
|
|
70
69
|
const chainType = _isChainSubstrateCompatible(chainInfo) ? ChainType.SUBSTRATE : ChainType.EVM;
|
|
71
70
|
const receiver = _reformatAddressWithChain(recipient !== null && recipient !== void 0 ? recipient : address, toChainInfo);
|
|
72
|
-
const fromAssetId = _getAssetSymbol(fromAsset);
|
|
73
|
-
const toAssetId = _getAssetSymbol(toAsset);
|
|
74
71
|
const minReceive = new BigNumber(quote.rate).times(1 - slippage).toString();
|
|
75
72
|
const processMetadata = params.process.steps[params.currentStep].metadata;
|
|
76
73
|
const quoteMetadata = processMetadata;
|
|
74
|
+
const fromAssetId = quoteMetadata.fromAssetId;
|
|
75
|
+
const toAssetId = quoteMetadata.toAssetId;
|
|
77
76
|
if (!processMetadata || !quoteMetadata) {
|
|
78
77
|
throw new Error('Metadata for Chainflip not found');
|
|
79
78
|
}
|
|
@@ -106,6 +105,7 @@ export class ChainflipSwapHandler {
|
|
|
106
105
|
method: 'GET'
|
|
107
106
|
}, this.isTestnet);
|
|
108
107
|
const data = await response.json();
|
|
108
|
+
console.log('Chainflip channel info:', data);
|
|
109
109
|
if (!data.id || !data.address || data.address === '' || !data.issuedBlock || !data.network || !data.channelId) {
|
|
110
110
|
throw new Error('Error get Chainflip data');
|
|
111
111
|
}
|
|
@@ -215,6 +215,8 @@ export class ChainflipSwapHandler {
|
|
|
215
215
|
receiver: _reformatAddressWithChain(params.request.recipient || params.request.address, destinationChain),
|
|
216
216
|
srcChain: metadata.srcChain,
|
|
217
217
|
destChain: metadata.destChain,
|
|
218
|
+
fromAssetId: metadata.fromAssetId,
|
|
219
|
+
toAssetId: metadata.toAssetId,
|
|
218
220
|
version: 2
|
|
219
221
|
}
|
|
220
222
|
};
|
package/types/swap/index.d.ts
CHANGED
|
@@ -184,9 +184,7 @@ export const getAccountTransactionActions = (signMode, networkType, type, _meta,
|
|
|
184
184
|
} else if (signMode === AccountSignMode.GENERIC_LEDGER) {
|
|
185
185
|
switch (networkType) {
|
|
186
186
|
case AccountChainType.SUBSTRATE:
|
|
187
|
-
return [...BASE_TRANSFER_ACTIONS, ...NATIVE_STAKE_ACTIONS, ...POOL_STAKE_ACTIONS, ...EARN_VDOT_ACTIONS, ...EARN_VMANTA_ACTIONS,
|
|
188
|
-
// ...EARN_LDOT_ACTIONS,
|
|
189
|
-
// ...EARN_SDOT_ACTIONS,
|
|
187
|
+
return [...BASE_TRANSFER_ACTIONS, ...NATIVE_STAKE_ACTIONS, ...POOL_STAKE_ACTIONS, ...EARN_VDOT_ACTIONS, ...EARN_VMANTA_ACTIONS, ...EARN_LDOT_ACTIONS, ...EARN_SDOT_ACTIONS,
|
|
190
188
|
// ...EARN_QDOT_ACTIONS,
|
|
191
189
|
...OTHER_ACTIONS];
|
|
192
190
|
case AccountChainType.ETHEREUM:
|
|
@@ -215,14 +213,12 @@ export const getAccountTransactionActions = (signMode, networkType, type, _meta,
|
|
|
215
213
|
if (specialNetwork === 'bifrost') {
|
|
216
214
|
result.push(...EARN_VDOT_ACTIONS, ...EARN_VMANTA_ACTIONS);
|
|
217
215
|
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
// result.push(...EARN_SDOT_ACTIONS);
|
|
225
|
-
// }
|
|
216
|
+
if (specialNetwork === 'acala') {
|
|
217
|
+
result.push(...EARN_LDOT_ACTIONS);
|
|
218
|
+
}
|
|
219
|
+
if (specialNetwork === 'parallel') {
|
|
220
|
+
result.push(...EARN_SDOT_ACTIONS);
|
|
221
|
+
}
|
|
226
222
|
|
|
227
223
|
// if (specialNetwork === 'interlay') {
|
|
228
224
|
// result.push(...EARN_QDOT_ACTIONS);
|