@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.
Files changed (33) hide show
  1. package/cjs/constants/staking.js +4 -2
  2. package/cjs/core/utils.js +14 -5
  3. package/cjs/koni/background/handlers/Extension.js +3 -2
  4. package/cjs/packageInfo.js +1 -1
  5. package/cjs/services/earning-service/constants/chains.js +6 -1
  6. package/cjs/services/earning-service/handlers/base.js +14 -0
  7. package/cjs/services/earning-service/handlers/native-staking/amplitude.js +9 -7
  8. package/cjs/services/earning-service/handlers/native-staking/base.js +2 -0
  9. package/cjs/services/earning-service/handlers/native-staking/para-chain.js +6 -3
  10. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +5 -3
  11. package/cjs/services/earning-service/service.js +96 -7
  12. package/cjs/services/swap-service/handler/chainflip-handler.js +5 -3
  13. package/cjs/utils/account/transform.js +7 -11
  14. package/constants/staking.d.ts +1 -0
  15. package/constants/staking.js +2 -1
  16. package/core/utils.js +14 -5
  17. package/koni/background/handlers/Extension.js +3 -2
  18. package/package.json +6 -6
  19. package/packageInfo.js +1 -1
  20. package/services/earning-service/constants/chains.d.ts +1 -0
  21. package/services/earning-service/constants/chains.js +4 -0
  22. package/services/earning-service/handlers/base.d.ts +3 -0
  23. package/services/earning-service/handlers/base.js +15 -1
  24. package/services/earning-service/handlers/native-staking/amplitude.d.ts +2 -2
  25. package/services/earning-service/handlers/native-staking/amplitude.js +9 -7
  26. package/services/earning-service/handlers/native-staking/base.js +2 -0
  27. package/services/earning-service/handlers/native-staking/para-chain.js +6 -3
  28. package/services/earning-service/handlers/native-staking/relay-chain.js +5 -3
  29. package/services/earning-service/service.d.ts +4 -0
  30. package/services/earning-service/service.js +94 -6
  31. package/services/swap-service/handler/chainflip-handler.js +6 -4
  32. package/types/swap/index.d.ts +2 -0
  33. package/utils/account/transform.js +7 -11
@@ -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 && !(0, _utilCrypto.isEthereumAddress)(account.address)) {
48
- return account.originGenesisHash ? 'migration' : 'polkadot';
49
- } else {
50
- return 'unnecessary';
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
- return `Ledger ${ledgerCheck === 'polkadot' ? 'Polkadot' : 'Migration'} address is not supported for this transfer`;
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, (_data$metadata = data.metadata) === null || _data$metadata === void 0 ? void 0 : _data$metadata.contractAddress);
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('ERC721Enumerable: owner index out of bounds')) {
2095
+ if (error.message.includes('index out of bounds')) {
2095
2096
  return true;
2096
2097
  } else {
2097
2098
  return false;
@@ -13,6 +13,6 @@ const packageInfo = {
13
13
  name: '@subwallet/extension-base',
14
14
  path: typeof __dirname === 'string' ? __dirname : 'auto',
15
15
  type: 'cjs',
16
- version: '1.3.48-2'
16
+ version: '1.3.50-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -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 identityPromises = delegatorState.map(delegate => (0, _utils2.parseIdentity)(substrateApi, delegate.owner));
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)(chainApi, address);
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)(chainApi, address);
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)(substrateApi, delegation.owner), substrateApi.api.query.parachainStaking.candidateInfo(delegation.owner), substrateApi.api.query.system.number(), substrateApi.api.query.timestamp.now()]);
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)(apiProps, collator.address)]);
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)(apiProps, collator.address)]);
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)(substrateApi, validatorAddress), substrateApi.api.query.staking.erasStakersPaged.entries(currentEra, validatorAddress)]);
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)(substrateApi, validatorAddress), substrateApi.api.query.staking.erasStakers(currentEra, validatorAddress)]);
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)(chainApi, address)]);
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
- this.yieldPositionSubject.subscribe({
159
- next: data => {
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(data).filter(item => {
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(_ref => {
458
- let [key, value] = _ref;
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(_ref2 => {
464
- let [key, value] = _ref2;
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
- // if (specialNetwork === 'acala') {
231
- // result.push(...EARN_LDOT_ACTIONS);
232
- // }
233
-
234
- // if (specialNetwork === 'parallel') {
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);
@@ -5,3 +5,4 @@ export declare type ChainRecommendValidator = {
5
5
  maxCount: number;
6
6
  preSelectValidators: string;
7
7
  };
8
+ export declare const CRON_REFRESH_EARNING_TARGETS: number;
@@ -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 && !isEthereumAddress(account.address)) {
29
- return account.originGenesisHash ? 'migration' : 'polkadot';
30
- } else {
31
- return 'unnecessary';
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
- return `Ledger ${ledgerCheck === 'polkadot' ? 'Polkadot' : 'Migration'} address is not supported for this transfer`;
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, (_data$metadata = data.metadata) === null || _data$metadata === void 0 ? void 0 : _data$metadata.contractAddress);
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('ERC721Enumerable: owner index out of bounds')) {
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.48-2",
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.48-2",
2870
- "@subwallet/extension-chains": "^1.3.48-2",
2871
- "@subwallet/extension-dapp": "^1.3.48-2",
2872
- "@subwallet/extension-inject": "^1.3.48-2",
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.48-2",
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.48-2'
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 identityPromises = delegatorState.map(delegate => parseIdentity(substrateApi, delegate.owner));
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(chainApi, address);
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(chainApi, address);
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(substrateApi, delegation.owner), substrateApi.api.query.parachainStaking.candidateInfo(delegation.owner), substrateApi.api.query.system.number(), substrateApi.api.query.timestamp.now()]);
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(apiProps, collator.address)]);
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(apiProps, collator.address)]);
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(substrateApi, validatorAddress), substrateApi.api.query.staking.erasStakersPaged.entries(currentEra, validatorAddress)]);
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(substrateApi, validatorAddress), substrateApi.api.query.staking.erasStakers(currentEra, validatorAddress)]);
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(chainApi, address)]);
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
- this.yieldPositionSubject.subscribe({
152
- next: data => {
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(data).filter(item => {
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 { _getAssetSymbol, _getContractAddressOfToken, _isChainSubstrateCompatible, _isNativeToken } from '@subwallet/extension-base/services/chain-service/utils';
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
  };
@@ -226,4 +226,6 @@ export interface HydrationSwapStepMetadata extends BaseSwapStepMetadata {
226
226
  export interface ChainFlipSwapStepMetadata extends BaseSwapStepMetadata {
227
227
  srcChain: string;
228
228
  destChain: string;
229
+ fromAssetId: string;
230
+ toAssetId: string;
229
231
  }
@@ -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
- // if (specialNetwork === 'acala') {
220
- // result.push(...EARN_LDOT_ACTIONS);
221
- // }
222
-
223
- // if (specialNetwork === 'parallel') {
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);