@subwallet/extension-base 1.3.63-0 → 1.3.64-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 (22) hide show
  1. package/cjs/koni/api/staking/bonding/utils.js +6 -0
  2. package/cjs/packageInfo.js +1 -1
  3. package/cjs/services/chain-service/utils/patch.js +1 -1
  4. package/cjs/services/earning-service/handlers/native-staking/energy.js +60 -6
  5. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +1 -4
  6. package/cjs/services/migration-service/scripts/MigrateTransactionHistoryBySymbol20251027.js +51 -0
  7. package/cjs/services/migration-service/scripts/databases/MigrateAssetSetting20251027.js +37 -0
  8. package/cjs/services/migration-service/scripts/index.js +5 -1
  9. package/koni/api/staking/bonding/utils.d.ts +1 -0
  10. package/koni/api/staking/bonding/utils.js +5 -0
  11. package/package.json +16 -6
  12. package/packageInfo.js +1 -1
  13. package/services/chain-service/utils/patch.d.ts +1 -1
  14. package/services/chain-service/utils/patch.js +1 -1
  15. package/services/earning-service/handlers/native-staking/energy.d.ts +6 -0
  16. package/services/earning-service/handlers/native-staking/energy.js +60 -8
  17. package/services/earning-service/handlers/native-staking/relay-chain.js +1 -4
  18. package/services/migration-service/scripts/MigrateTransactionHistoryBySymbol20251027.d.ts +4 -0
  19. package/services/migration-service/scripts/MigrateTransactionHistoryBySymbol20251027.js +42 -0
  20. package/services/migration-service/scripts/databases/MigrateAssetSetting20251027.d.ts +4 -0
  21. package/services/migration-service/scripts/databases/MigrateAssetSetting20251027.js +29 -0
  22. package/services/migration-service/scripts/index.js +5 -1
@@ -11,6 +11,7 @@ exports.calculateAlephZeroValidatorReturn = calculateAlephZeroValidatorReturn;
11
11
  exports.calculateAnalogChainStakedReturn = calculateAnalogChainStakedReturn;
12
12
  exports.calculateChainStakedReturn = calculateChainStakedReturn;
13
13
  exports.calculateChainStakedReturnV2 = calculateChainStakedReturnV2;
14
+ exports.calculateEnergyWebCollatorReturn = calculateEnergyWebCollatorReturn;
14
15
  exports.calculateInflation = calculateInflation;
15
16
  exports.calculateTernoaValidatorReturn = calculateTernoaValidatorReturn;
16
17
  exports.calculateValidatorStakedReturn = calculateValidatorStakedReturn;
@@ -139,6 +140,11 @@ async function calculateChainStakedReturnV2(chainInfo, totalIssuance, erasPerDay
139
140
  function calculateAlephZeroValidatorReturn(chainStakedReturn, commission) {
140
141
  return chainStakedReturn * (100 - commission) / 100;
141
142
  }
143
+ function calculateEnergyWebCollatorReturn(annualReward, collatorCommission, numberCollators, totalStake) {
144
+ const rewardForNominators = new _bignumber.default(annualReward).multipliedBy(1 - collatorCommission);
145
+ const rewardPerNominator = rewardForNominators.div(numberCollators);
146
+ return rewardPerNominator.div(totalStake).shiftedBy(2).toNumber();
147
+ }
142
148
  function calculateTernoaValidatorReturn(rewardPerValidator, validatorStake, commission) {
143
149
  const percentRewardForNominators = (100 - commission) / 100;
144
150
  const rewardForNominators = rewardPerValidator * percentRewardForNominators;
@@ -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.63-0'
16
+ version: '1.3.64-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -12,7 +12,7 @@ const PRODUCTION_BRANCHES = ['master', 'webapp', 'webapp-dev'];
12
12
  const branchName = process.env.BRANCH_NAME || 'subwallet-dev';
13
13
  const fetchDomain = process.env.PATCH_CHAIN_LIST_URL || (PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'https://chain-list-assets.subwallet.app' : 'https://dev.sw-chain-list-assets.pages.dev');
14
14
  const fetchFile = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'list.json' : 'preview.json';
15
- const ChainListVersion = '0.2.119'; // update this when build chain-list
15
+ const ChainListVersion = '0.2.120'; // update this when build chain-list
16
16
 
17
17
  // todo: move this interface to chainlist
18
18
  exports.ChainListVersion = ChainListVersion;
@@ -17,6 +17,9 @@ var _basePara = _interopRequireDefault(require("./base-para"));
17
17
  // Copyright 2019-2022 @subwallet/extension-base
18
18
  // SPDX-License-Identifier: Apache-2.0
19
19
 
20
+ const DEFAULT_ANNUAL_REWARD = {
21
+ energy_web_x: 2000000
22
+ };
20
23
  class EnergyNativeStakingPoolHandler extends _basePara.default {
21
24
  /* Subscribe pool info */
22
25
 
@@ -60,6 +63,13 @@ class EnergyNativeStakingPoolHandler extends _basePara.default {
60
63
  const unstakingPeriod = parseInt(unstakingDelay.toString()) * eraTime;
61
64
  const minStake = '0';
62
65
  const minToHuman = (0, _utils3.formatNumber)(minStake.toString(), nativeToken.decimals || 0, _utils3.balanceFormatter);
66
+ const collators = await this.getPoolTargets();
67
+ let maxApy = 0;
68
+ for (const collator of collators) {
69
+ if (collator.expectedReturn && collator.expectedReturn > maxApy) {
70
+ maxApy = collator.expectedReturn;
71
+ }
72
+ }
63
73
  const data = {
64
74
  ...this.baseInfo,
65
75
  type: this.type,
@@ -83,8 +93,7 @@ class EnergyNativeStakingPoolHandler extends _basePara.default {
83
93
  // TODO recheck
84
94
  era,
85
95
  eraTime,
86
- totalApy: undefined,
87
- // not have
96
+ totalApy: maxApy,
88
97
  tvl: totalStake.toString(),
89
98
  unstakingPeriod: unstakingPeriod
90
99
  },
@@ -257,12 +266,21 @@ class EnergyNativeStakingPoolHandler extends _basePara.default {
257
266
  const apiProps = await this.substrateApi.isReady;
258
267
  const substrateIdentityApi = this.substrateIdentityApi;
259
268
  const allCollators = [];
260
- const [_allCollators, _selectedCandidates] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo.entries(),
261
- // use it when energy support collatorCommission
262
- // apiProps.api.query.parachainStaking.collatorCommission(),
263
- apiProps.api.query.parachainStaking.selectedCandidates()]);
269
+ const [_allCollators, _selectedCandidates, _eraInfo, unstakingDelay] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo.entries(), apiProps.api.query.parachainStaking.selectedCandidates(), apiProps.api.query.parachainStaking.era(), apiProps.api.query.parachainStaking.delay()]);
270
+ const delay = parseInt(unstakingDelay.toString()); // in era unit
271
+ const roundInfo = _eraInfo.toPrimitive();
272
+ const currentRound = roundInfo.current;
273
+ let defaultCommission = 0;
274
+ if (apiProps.api.query.parachainStaking.defaultCollatorCommission) {
275
+ const _defaultCommission = await apiProps.api.query.parachainStaking.defaultCollatorCommission();
276
+ const {
277
+ current
278
+ } = _defaultCommission.toPrimitive();
279
+ defaultCommission = current / 1000000000;
280
+ }
264
281
  const maxNominationPerCollator = apiProps.api.consts.parachainStaking.maxTopNominationsPerCandidate.toString();
265
282
  const selectedCollators = _selectedCandidates.toPrimitive();
283
+ const selectedCollatorsCount = selectedCollators.length;
266
284
  for (const collator of _allCollators) {
267
285
  const _collatorAddress = collator[0].toHuman();
268
286
  const collatorAddress = _collatorAddress[0];
@@ -289,6 +307,41 @@ class EnergyNativeStakingPoolHandler extends _basePara.default {
289
307
  });
290
308
  }
291
309
  }
310
+ const annualReward = DEFAULT_ANNUAL_REWARD[this.chain] ? new _util.BN(DEFAULT_ANNUAL_REWARD[this.chain]).mul(_util.BN_TEN.pow(new _util.BN(this.nativeToken.decimals || 18))) : _util.BN_ZERO;
311
+
312
+ // calculate expected return
313
+ await Promise.all(allCollators.map(async collator => {
314
+ if (!selectedCollators.includes(collator.address) || annualReward.lte(_util.BN_ZERO)) {
315
+ return;
316
+ }
317
+ const [_topNominations, _nominationScheduledRequests] = await Promise.all([apiProps.api.query.parachainStaking.topNominations(collator.address), apiProps.api.query.parachainStaking.nominationScheduledRequests(collator.address)]);
318
+ const nominationScheduledRequests = _nominationScheduledRequests.toPrimitive();
319
+ const topNominations = _topNominations.toPrimitive();
320
+ const topNominationsRecord = topNominations.nominations.reduce((record, _ref) => {
321
+ let {
322
+ amount,
323
+ owner
324
+ } = _ref;
325
+ record[owner] = amount || '0';
326
+ return record;
327
+ }, {});
328
+ let bnTotalActiveStake = new _util.BN(collator.totalStake);
329
+ if (nominationScheduledRequests !== null && nominationScheduledRequests !== void 0 && nominationScheduledRequests.length) {
330
+ const bnTotalInactiveStake = nominationScheduledRequests.reduce((partialSum, _ref2) => {
331
+ let {
332
+ action,
333
+ nominator,
334
+ whenExecutable
335
+ } = _ref2;
336
+ if (whenExecutable + delay - parseInt(currentRound) < 0 && action) {
337
+ return partialSum.add(new _util.BN(topNominationsRecord[nominator] || Object.values(action)[0] || _util.BN_ZERO));
338
+ }
339
+ return partialSum;
340
+ }, _util.BN_ZERO);
341
+ bnTotalActiveStake = bnTotalActiveStake.sub(bnTotalInactiveStake);
342
+ }
343
+ collator.expectedReturn = (0, _utils.calculateEnergyWebCollatorReturn)(annualReward.toString(), defaultCommission, selectedCollatorsCount, bnTotalActiveStake.toString());
344
+ }));
292
345
  const extraInfoMap = {};
293
346
  await Promise.all(allCollators.map(async collator => {
294
347
  const [_info, [identity, isReasonable]] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo(collator.address), (0, _utils2.parseIdentity)(substrateIdentityApi, collator.address)]);
@@ -304,6 +357,7 @@ class EnergyNativeStakingPoolHandler extends _basePara.default {
304
357
  validator.blocked = !extraInfoMap[validator.address].active;
305
358
  validator.identity = extraInfoMap[validator.address].identity;
306
359
  validator.isVerified = extraInfoMap[validator.address].isVerified;
360
+ validator.commission = defaultCommission * 100;
307
361
  }
308
362
  return allCollators;
309
363
  }
@@ -67,10 +67,7 @@ class RelayNativeStakingPoolHandler extends _base.default {
67
67
  }
68
68
  const unlimitedNominatorRewarded = substrateApi.api.consts.staking.maxExposurePageSize !== undefined;
69
69
  const maxNominatorRewarded = (_substrateApi$api$con = substrateApi.api.consts.staking.maxNominatorRewardedPerValidator) === null || _substrateApi$api$con === void 0 ? void 0 : _substrateApi$api$con.toString();
70
-
71
- // hotfix for kusama asset hub migration
72
- const kahMaxNominations = '24';
73
- const maxNominations = chainInfo.slug === 'statemine' ? kahMaxNominations : await (0, _utils.getRelayMaxNominations)(substrateApi, this.chain);
70
+ const maxNominations = await (0, _utils.getRelayMaxNominations)(substrateApi, this.chain);
74
71
  const currentEra = _currentEra.toString();
75
72
  const maxUnlockingChunks = substrateApi.api.consts.staking.maxUnlockingChunks.toString();
76
73
  const unlockingEras = substrateApi.api.consts.staking.bondingDuration.toString();
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _Base = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/Base"));
9
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
10
+ // SPDX-License-Identifier: Apache-2.0
11
+
12
+ class MigrateTransactionHistoryBySymbol20251027 extends _Base.default {
13
+ async run() {
14
+ const state = this.state;
15
+ try {
16
+ const changeSlugsMap = {
17
+ 'moonriver-ERC20-GLMR.wb-0xFfFffFff1a49463978f19dfD6983f2fa1885C254': 'moonriver-ERC20-GLMR.mb-0xFfFffFff1a49463978f19dfD6983f2fa1885C254'
18
+ };
19
+ const allTxs = [];
20
+ await Promise.all(Object.entries(changeSlugsMap).map(async (_ref, i) => {
21
+ let [oldSlug, newSlug] = _ref;
22
+ const oldSlugSplit = oldSlug.split('-');
23
+ const oldChainSlug = oldSlugSplit[0];
24
+ const oldSymbolSlug = oldSlugSplit[2];
25
+ const newSlugSplit = newSlug.split('-');
26
+ const newSymbolSlug = newSlugSplit[2];
27
+ const filterTransactions = await state.dbService.stores.transaction.table.where({
28
+ chain: oldChainSlug
29
+ }).and(tx => {
30
+ var _tx$amount;
31
+ return ((_tx$amount = tx.amount) === null || _tx$amount === void 0 ? void 0 : _tx$amount.symbol) === oldSymbolSlug;
32
+ }).toArray();
33
+ if (filterTransactions.length > 0) {
34
+ for (const transaction of filterTransactions) {
35
+ if (transaction.amount && transaction.amount.symbol === oldSymbolSlug) {
36
+ transaction.amount.symbol = newSymbolSlug;
37
+ }
38
+ if (transaction.fee && transaction.fee.symbol === oldSymbolSlug) {
39
+ transaction.fee.symbol = newSymbolSlug;
40
+ }
41
+ }
42
+ }
43
+ allTxs.push(...filterTransactions);
44
+ }));
45
+ await state.dbService.stores.transaction.table.bulkPut(allTxs);
46
+ } catch (e) {
47
+ this.logger.error(e);
48
+ }
49
+ }
50
+ }
51
+ exports.default = MigrateTransactionHistoryBySymbol20251027;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _Base = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/Base"));
9
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
10
+ // SPDX-License-Identifier: Apache-2.0
11
+
12
+ class MigrateAssetSetting20251027 extends _Base.default {
13
+ async run() {
14
+ try {
15
+ const changeSlugsMap = {
16
+ 'moonriver-ERC20-GLMR.wb-0xFfFffFff1a49463978f19dfD6983f2fa1885C254': 'moonriver-ERC20-GLMR.mb-0xFfFffFff1a49463978f19dfD6983f2fa1885C254'
17
+ };
18
+ const assetSetting = await this.state.chainService.getAssetSettings();
19
+ const migratedAssetSetting = {};
20
+ for (const [oldSlug, newSlug] of Object.entries(changeSlugsMap)) {
21
+ if (Object.keys(assetSetting).includes(oldSlug)) {
22
+ const isVisible = assetSetting[oldSlug].visible;
23
+ migratedAssetSetting[newSlug] = {
24
+ visible: isVisible
25
+ };
26
+ }
27
+ }
28
+ this.state.chainService.setAssetSettings({
29
+ ...assetSetting,
30
+ ...migratedAssetSetting
31
+ });
32
+ } catch (e) {
33
+ console.error(e);
34
+ }
35
+ }
36
+ }
37
+ exports.default = MigrateAssetSetting20251027;
@@ -9,6 +9,7 @@ var _MigrateChainPatrol = _interopRequireDefault(require("@subwallet/extension-b
9
9
  var _ClearMetadataDatabase = _interopRequireDefault(require("./databases/ClearMetadataDatabase"));
10
10
  var _ClearMetadataForMythos = _interopRequireDefault(require("./databases/ClearMetadataForMythos"));
11
11
  var _MigrateAssetSetting = _interopRequireDefault(require("./databases/MigrateAssetSetting"));
12
+ var _MigrateAssetSetting2 = _interopRequireDefault(require("./databases/MigrateAssetSetting20251027"));
12
13
  var _MigrateEarningVersion = _interopRequireDefault(require("./databases/MigrateEarningVersion"));
13
14
  var _ReloadMetadata = _interopRequireDefault(require("./databases/ReloadMetadata"));
14
15
  var _MigrateLedgerAccount = _interopRequireDefault(require("./keyring/MigrateLedgerAccount"));
@@ -33,6 +34,7 @@ var _MigrateTokenDecimals = _interopRequireDefault(require("./MigrateTokenDecima
33
34
  var _MigrateTransactionHistory = _interopRequireDefault(require("./MigrateTransactionHistory"));
34
35
  var _MigrateTransactionHistoryBridge = _interopRequireDefault(require("./MigrateTransactionHistoryBridge"));
35
36
  var _MigrateTransactionHistoryBySymbol = _interopRequireDefault(require("./MigrateTransactionHistoryBySymbol"));
37
+ var _MigrateTransactionHistoryBySymbol2 = _interopRequireDefault(require("./MigrateTransactionHistoryBySymbol20251027"));
36
38
  var _MigrateWalletReference = _interopRequireDefault(require("./MigrateWalletReference"));
37
39
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
38
40
  // SPDX-License-Identifier: Apache-2.0
@@ -78,6 +80,8 @@ var _default = {
78
80
  // [`${EVERYTIME}-1`]: AutoEnableChainsTokens
79
81
  '1.3.42-01': _MigrateNewUnifiedAccount.default,
80
82
  '1.3.54-01': _MigrateChainPatrol.default,
81
- '1.3.62-01': _DeleteEarningData2.default
83
+ '1.3.62-01': _DeleteEarningData2.default,
84
+ '1.3.64-01': _MigrateAssetSetting2.default,
85
+ '1.3.64-02': _MigrateTransactionHistoryBySymbol2.default
82
86
  };
83
87
  exports.default = _default;
@@ -102,6 +102,7 @@ export declare function calculateInflation(totalEraStake: BN, totalIssuance: BN,
102
102
  export declare function calculateChainStakedReturn(inflation: number, totalEraStake: BN, totalIssuance: BN, networkKey: string): number;
103
103
  export declare function calculateChainStakedReturnV2(chainInfo: _ChainInfo, totalIssuance: string, erasPerDay: number, lastTotalStaked: string, validatorEraReward: BigNumber, inflation: BigNumber, isCompound?: boolean): Promise<number | undefined>;
104
104
  export declare function calculateAlephZeroValidatorReturn(chainStakedReturn: number, commission: number): number;
105
+ export declare function calculateEnergyWebCollatorReturn(annualReward: string, collatorCommission: number, numberCollators: number, totalStake: string): number;
105
106
  export declare function calculateTernoaValidatorReturn(rewardPerValidator: number, validatorStake: number, commission: number): number;
106
107
  export declare function calculateAnalogChainStakedReturn(): Promise<number | undefined>;
107
108
  export declare function calculateValidatorStakedReturn(chainStakedReturn: number, totalValidatorStake: BN, avgStake: BN, commission: number): number;
@@ -97,6 +97,11 @@ export async function calculateChainStakedReturnV2(chainInfo, totalIssuance, era
97
97
  export function calculateAlephZeroValidatorReturn(chainStakedReturn, commission) {
98
98
  return chainStakedReturn * (100 - commission) / 100;
99
99
  }
100
+ export function calculateEnergyWebCollatorReturn(annualReward, collatorCommission, numberCollators, totalStake) {
101
+ const rewardForNominators = new BigNumber(annualReward).multipliedBy(1 - collatorCommission);
102
+ const rewardPerNominator = rewardForNominators.div(numberCollators);
103
+ return rewardPerNominator.div(totalStake).shiftedBy(2).toNumber();
104
+ }
100
105
  export function calculateTernoaValidatorReturn(rewardPerValidator, validatorStake, commission) {
101
106
  const percentRewardForNominators = (100 - commission) / 100;
102
107
  const rewardForNominators = rewardPerValidator * percentRewardForNominators;
package/package.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "./cjs/detectPackage.js"
18
18
  ],
19
19
  "type": "module",
20
- "version": "1.3.63-0",
20
+ "version": "1.3.64-0",
21
21
  "main": "./cjs/index.js",
22
22
  "module": "./index.js",
23
23
  "types": "./index.d.ts",
@@ -1486,6 +1486,11 @@
1486
1486
  "require": "./cjs/services/migration-service/scripts/databases/MigrateAssetSetting.js",
1487
1487
  "default": "./services/migration-service/scripts/databases/MigrateAssetSetting.js"
1488
1488
  },
1489
+ "./services/migration-service/scripts/databases/MigrateAssetSetting20251027": {
1490
+ "types": "./services/migration-service/scripts/databases/MigrateAssetSetting20251027.d.ts",
1491
+ "require": "./cjs/services/migration-service/scripts/databases/MigrateAssetSetting20251027.js",
1492
+ "default": "./services/migration-service/scripts/databases/MigrateAssetSetting20251027.js"
1493
+ },
1489
1494
  "./services/migration-service/scripts/databases/MigrateEarningHistory": {
1490
1495
  "types": "./services/migration-service/scripts/databases/MigrateEarningHistory.d.ts",
1491
1496
  "require": "./cjs/services/migration-service/scripts/databases/MigrateEarningHistory.js",
@@ -1616,6 +1621,11 @@
1616
1621
  "require": "./cjs/services/migration-service/scripts/MigrateTransactionHistoryBySymbol.js",
1617
1622
  "default": "./services/migration-service/scripts/MigrateTransactionHistoryBySymbol.js"
1618
1623
  },
1624
+ "./services/migration-service/scripts/MigrateTransactionHistoryBySymbol20251027": {
1625
+ "types": "./services/migration-service/scripts/MigrateTransactionHistoryBySymbol20251027.d.ts",
1626
+ "require": "./cjs/services/migration-service/scripts/MigrateTransactionHistoryBySymbol20251027.js",
1627
+ "default": "./services/migration-service/scripts/MigrateTransactionHistoryBySymbol20251027.js"
1628
+ },
1619
1629
  "./services/migration-service/scripts/MigrateWalletReference": {
1620
1630
  "types": "./services/migration-service/scripts/MigrateWalletReference.d.ts",
1621
1631
  "require": "./cjs/services/migration-service/scripts/MigrateWalletReference.js",
@@ -2893,11 +2903,11 @@
2893
2903
  "@sora-substrate/type-definitions": "^1.17.7",
2894
2904
  "@substrate/connect": "^0.8.9",
2895
2905
  "@subwallet-monorepos/subwallet-services-sdk": "^0.1.8",
2896
- "@subwallet/chain-list": "0.2.119",
2897
- "@subwallet/extension-base": "^1.3.63-0",
2898
- "@subwallet/extension-chains": "^1.3.63-0",
2899
- "@subwallet/extension-dapp": "^1.3.63-0",
2900
- "@subwallet/extension-inject": "^1.3.63-0",
2906
+ "@subwallet/chain-list": "0.2.120",
2907
+ "@subwallet/extension-base": "^1.3.64-0",
2908
+ "@subwallet/extension-chains": "^1.3.64-0",
2909
+ "@subwallet/extension-dapp": "^1.3.64-0",
2910
+ "@subwallet/extension-inject": "^1.3.64-0",
2901
2911
  "@subwallet/keyring": "^0.1.13",
2902
2912
  "@subwallet/ui-keyring": "^0.1.13",
2903
2913
  "@ton/core": "^0.56.3",
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.63-0'
10
+ version: '1.3.64-0'
11
11
  };
@@ -1,5 +1,5 @@
1
1
  import { _ChainAsset, _ChainInfo, _MultiChainAsset } from '@subwallet/chain-list/types';
2
- export declare const ChainListVersion = "0.2.119";
2
+ export declare const ChainListVersion = "0.2.120";
3
3
  export interface PatchInfo {
4
4
  patchVersion: string;
5
5
  appliedVersion: string;
@@ -5,7 +5,7 @@ const PRODUCTION_BRANCHES = ['master', 'webapp', 'webapp-dev'];
5
5
  const branchName = process.env.BRANCH_NAME || 'subwallet-dev';
6
6
  const fetchDomain = process.env.PATCH_CHAIN_LIST_URL || (PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'https://chain-list-assets.subwallet.app' : 'https://dev.sw-chain-list-assets.pages.dev');
7
7
  const fetchFile = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'list.json' : 'preview.json';
8
- export const ChainListVersion = '0.2.119'; // update this when build chain-list
8
+ export const ChainListVersion = '0.2.120'; // update this when build chain-list
9
9
 
10
10
  // todo: move this interface to chainlist
11
11
 
@@ -16,6 +16,12 @@ export interface PalletEnergyStakingNominationRequestsScheduledRequest {
16
16
  whenExecutable: number;
17
17
  action: Record<PalletParachainStakingRequestType, number>;
18
18
  }
19
+ export interface PalletEnergyStakingTopNominations {
20
+ nominations: Array<{
21
+ owner: string;
22
+ amount: string;
23
+ }>;
24
+ }
19
25
  export default class EnergyNativeStakingPoolHandler extends BaseParaNativeStakingPoolHandler {
20
26
  subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
21
27
  parseNominatorMetadata(chainInfo: _ChainInfo, address: string, substrateApi: _SubstrateApi, nominatorState: PalletEnergyStakingNominator): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
@@ -3,13 +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 { getBondedValidators, getEarningStatusByNominations, isUnstakeAll } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
6
+ import { calculateEnergyWebCollatorReturn, getBondedValidators, getEarningStatusByNominations, isUnstakeAll } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
7
7
  import { _EXPECTED_BLOCK_TIME, _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
8
8
  import { parseIdentity } from '@subwallet/extension-base/services/earning-service/utils';
9
9
  import { BasicTxErrorType, EarningStatus, UnstakingStatus } from '@subwallet/extension-base/types';
10
10
  import { balanceFormatter, formatNumber, parseRawNumber, reformatAddress } from '@subwallet/extension-base/utils';
11
- import { BN, BN_ZERO } from '@polkadot/util';
11
+ import { BN, BN_TEN, BN_ZERO } from '@polkadot/util';
12
12
  import BaseParaNativeStakingPoolHandler from "./base-para.js";
13
+ const DEFAULT_ANNUAL_REWARD = {
14
+ energy_web_x: 2000000
15
+ };
13
16
  export default class EnergyNativeStakingPoolHandler extends BaseParaNativeStakingPoolHandler {
14
17
  /* Subscribe pool info */
15
18
 
@@ -53,6 +56,13 @@ export default class EnergyNativeStakingPoolHandler extends BaseParaNativeStakin
53
56
  const unstakingPeriod = parseInt(unstakingDelay.toString()) * eraTime;
54
57
  const minStake = '0';
55
58
  const minToHuman = formatNumber(minStake.toString(), nativeToken.decimals || 0, balanceFormatter);
59
+ const collators = await this.getPoolTargets();
60
+ let maxApy = 0;
61
+ for (const collator of collators) {
62
+ if (collator.expectedReturn && collator.expectedReturn > maxApy) {
63
+ maxApy = collator.expectedReturn;
64
+ }
65
+ }
56
66
  const data = {
57
67
  ...this.baseInfo,
58
68
  type: this.type,
@@ -76,8 +86,7 @@ export default class EnergyNativeStakingPoolHandler extends BaseParaNativeStakin
76
86
  // TODO recheck
77
87
  era,
78
88
  eraTime,
79
- totalApy: undefined,
80
- // not have
89
+ totalApy: maxApy,
81
90
  tvl: totalStake.toString(),
82
91
  unstakingPeriod: unstakingPeriod
83
92
  },
@@ -250,12 +259,21 @@ export default class EnergyNativeStakingPoolHandler extends BaseParaNativeStakin
250
259
  const apiProps = await this.substrateApi.isReady;
251
260
  const substrateIdentityApi = this.substrateIdentityApi;
252
261
  const allCollators = [];
253
- const [_allCollators, _selectedCandidates] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo.entries(),
254
- // use it when energy support collatorCommission
255
- // apiProps.api.query.parachainStaking.collatorCommission(),
256
- apiProps.api.query.parachainStaking.selectedCandidates()]);
262
+ const [_allCollators, _selectedCandidates, _eraInfo, unstakingDelay] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo.entries(), apiProps.api.query.parachainStaking.selectedCandidates(), apiProps.api.query.parachainStaking.era(), apiProps.api.query.parachainStaking.delay()]);
263
+ const delay = parseInt(unstakingDelay.toString()); // in era unit
264
+ const roundInfo = _eraInfo.toPrimitive();
265
+ const currentRound = roundInfo.current;
266
+ let defaultCommission = 0;
267
+ if (apiProps.api.query.parachainStaking.defaultCollatorCommission) {
268
+ const _defaultCommission = await apiProps.api.query.parachainStaking.defaultCollatorCommission();
269
+ const {
270
+ current
271
+ } = _defaultCommission.toPrimitive();
272
+ defaultCommission = current / 1000000000;
273
+ }
257
274
  const maxNominationPerCollator = apiProps.api.consts.parachainStaking.maxTopNominationsPerCandidate.toString();
258
275
  const selectedCollators = _selectedCandidates.toPrimitive();
276
+ const selectedCollatorsCount = selectedCollators.length;
259
277
  for (const collator of _allCollators) {
260
278
  const _collatorAddress = collator[0].toHuman();
261
279
  const collatorAddress = _collatorAddress[0];
@@ -282,6 +300,39 @@ export default class EnergyNativeStakingPoolHandler extends BaseParaNativeStakin
282
300
  });
283
301
  }
284
302
  }
303
+ const annualReward = DEFAULT_ANNUAL_REWARD[this.chain] ? new BN(DEFAULT_ANNUAL_REWARD[this.chain]).mul(BN_TEN.pow(new BN(this.nativeToken.decimals || 18))) : BN_ZERO;
304
+
305
+ // calculate expected return
306
+ await Promise.all(allCollators.map(async collator => {
307
+ if (!selectedCollators.includes(collator.address) || annualReward.lte(BN_ZERO)) {
308
+ return;
309
+ }
310
+ const [_topNominations, _nominationScheduledRequests] = await Promise.all([apiProps.api.query.parachainStaking.topNominations(collator.address), apiProps.api.query.parachainStaking.nominationScheduledRequests(collator.address)]);
311
+ const nominationScheduledRequests = _nominationScheduledRequests.toPrimitive();
312
+ const topNominations = _topNominations.toPrimitive();
313
+ const topNominationsRecord = topNominations.nominations.reduce((record, {
314
+ amount,
315
+ owner
316
+ }) => {
317
+ record[owner] = amount || '0';
318
+ return record;
319
+ }, {});
320
+ let bnTotalActiveStake = new BN(collator.totalStake);
321
+ if (nominationScheduledRequests !== null && nominationScheduledRequests !== void 0 && nominationScheduledRequests.length) {
322
+ const bnTotalInactiveStake = nominationScheduledRequests.reduce((partialSum, {
323
+ action,
324
+ nominator,
325
+ whenExecutable
326
+ }) => {
327
+ if (whenExecutable + delay - parseInt(currentRound) < 0 && action) {
328
+ return partialSum.add(new BN(topNominationsRecord[nominator] || Object.values(action)[0] || BN_ZERO));
329
+ }
330
+ return partialSum;
331
+ }, BN_ZERO);
332
+ bnTotalActiveStake = bnTotalActiveStake.sub(bnTotalInactiveStake);
333
+ }
334
+ collator.expectedReturn = calculateEnergyWebCollatorReturn(annualReward.toString(), defaultCommission, selectedCollatorsCount, bnTotalActiveStake.toString());
335
+ }));
285
336
  const extraInfoMap = {};
286
337
  await Promise.all(allCollators.map(async collator => {
287
338
  const [_info, [identity, isReasonable]] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo(collator.address), parseIdentity(substrateIdentityApi, collator.address)]);
@@ -297,6 +348,7 @@ export default class EnergyNativeStakingPoolHandler extends BaseParaNativeStakin
297
348
  validator.blocked = !extraInfoMap[validator.address].active;
298
349
  validator.identity = extraInfoMap[validator.address].identity;
299
350
  validator.isVerified = extraInfoMap[validator.address].isVerified;
351
+ validator.commission = defaultCommission * 100;
300
352
  }
301
353
  return allCollators;
302
354
  }
@@ -60,10 +60,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
60
60
  }
61
61
  const unlimitedNominatorRewarded = substrateApi.api.consts.staking.maxExposurePageSize !== undefined;
62
62
  const maxNominatorRewarded = (_substrateApi$api$con = substrateApi.api.consts.staking.maxNominatorRewardedPerValidator) === null || _substrateApi$api$con === void 0 ? void 0 : _substrateApi$api$con.toString();
63
-
64
- // hotfix for kusama asset hub migration
65
- const kahMaxNominations = '24';
66
- const maxNominations = chainInfo.slug === 'statemine' ? kahMaxNominations : await getRelayMaxNominations(substrateApi, this.chain);
63
+ const maxNominations = await getRelayMaxNominations(substrateApi, this.chain);
67
64
  const currentEra = _currentEra.toString();
68
65
  const maxUnlockingChunks = substrateApi.api.consts.staking.maxUnlockingChunks.toString();
69
66
  const unlockingEras = substrateApi.api.consts.staking.bondingDuration.toString();
@@ -0,0 +1,4 @@
1
+ import BaseMigrationJob from '@subwallet/extension-base/services/migration-service/Base';
2
+ export default class MigrateTransactionHistoryBySymbol20251027 extends BaseMigrationJob {
3
+ run(): Promise<void>;
4
+ }
@@ -0,0 +1,42 @@
1
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import BaseMigrationJob from '@subwallet/extension-base/services/migration-service/Base';
5
+ export default class MigrateTransactionHistoryBySymbol20251027 extends BaseMigrationJob {
6
+ async run() {
7
+ const state = this.state;
8
+ try {
9
+ const changeSlugsMap = {
10
+ 'moonriver-ERC20-GLMR.wb-0xFfFffFff1a49463978f19dfD6983f2fa1885C254': 'moonriver-ERC20-GLMR.mb-0xFfFffFff1a49463978f19dfD6983f2fa1885C254'
11
+ };
12
+ const allTxs = [];
13
+ await Promise.all(Object.entries(changeSlugsMap).map(async ([oldSlug, newSlug], i) => {
14
+ const oldSlugSplit = oldSlug.split('-');
15
+ const oldChainSlug = oldSlugSplit[0];
16
+ const oldSymbolSlug = oldSlugSplit[2];
17
+ const newSlugSplit = newSlug.split('-');
18
+ const newSymbolSlug = newSlugSplit[2];
19
+ const filterTransactions = await state.dbService.stores.transaction.table.where({
20
+ chain: oldChainSlug
21
+ }).and(tx => {
22
+ var _tx$amount;
23
+ return ((_tx$amount = tx.amount) === null || _tx$amount === void 0 ? void 0 : _tx$amount.symbol) === oldSymbolSlug;
24
+ }).toArray();
25
+ if (filterTransactions.length > 0) {
26
+ for (const transaction of filterTransactions) {
27
+ if (transaction.amount && transaction.amount.symbol === oldSymbolSlug) {
28
+ transaction.amount.symbol = newSymbolSlug;
29
+ }
30
+ if (transaction.fee && transaction.fee.symbol === oldSymbolSlug) {
31
+ transaction.fee.symbol = newSymbolSlug;
32
+ }
33
+ }
34
+ }
35
+ allTxs.push(...filterTransactions);
36
+ }));
37
+ await state.dbService.stores.transaction.table.bulkPut(allTxs);
38
+ } catch (e) {
39
+ this.logger.error(e);
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,4 @@
1
+ import BaseMigrationJob from '@subwallet/extension-base/services/migration-service/Base';
2
+ export default class MigrateAssetSetting20251027 extends BaseMigrationJob {
3
+ run(): Promise<void>;
4
+ }
@@ -0,0 +1,29 @@
1
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import BaseMigrationJob from '@subwallet/extension-base/services/migration-service/Base';
5
+ export default class MigrateAssetSetting20251027 extends BaseMigrationJob {
6
+ async run() {
7
+ try {
8
+ const changeSlugsMap = {
9
+ 'moonriver-ERC20-GLMR.wb-0xFfFffFff1a49463978f19dfD6983f2fa1885C254': 'moonriver-ERC20-GLMR.mb-0xFfFffFff1a49463978f19dfD6983f2fa1885C254'
10
+ };
11
+ const assetSetting = await this.state.chainService.getAssetSettings();
12
+ const migratedAssetSetting = {};
13
+ for (const [oldSlug, newSlug] of Object.entries(changeSlugsMap)) {
14
+ if (Object.keys(assetSetting).includes(oldSlug)) {
15
+ const isVisible = assetSetting[oldSlug].visible;
16
+ migratedAssetSetting[newSlug] = {
17
+ visible: isVisible
18
+ };
19
+ }
20
+ }
21
+ this.state.chainService.setAssetSettings({
22
+ ...assetSetting,
23
+ ...migratedAssetSetting
24
+ });
25
+ } catch (e) {
26
+ console.error(e);
27
+ }
28
+ }
29
+ }
@@ -5,6 +5,7 @@ import MigrateChainPatrol from '@subwallet/extension-base/services/migration-ser
5
5
  import ClearMetadataDatabase from "./databases/ClearMetadataDatabase.js";
6
6
  import ClearMetadataForMythos from "./databases/ClearMetadataForMythos.js";
7
7
  import MigrateAssetSetting from "./databases/MigrateAssetSetting.js";
8
+ import MigrateAssetSetting20251027 from "./databases/MigrateAssetSetting20251027.js";
8
9
  import MigrateEarningVersion from "./databases/MigrateEarningVersion.js";
9
10
  import ReloadMetadata from "./databases/ReloadMetadata.js";
10
11
  import MigrateLedgerAccount from "./keyring/MigrateLedgerAccount.js";
@@ -29,6 +30,7 @@ import MigrateTokenDecimals from "./MigrateTokenDecimals.js";
29
30
  import MigrateTransactionHistory from "./MigrateTransactionHistory.js";
30
31
  import MigrateTransactionHistoryBridge from "./MigrateTransactionHistoryBridge.js";
31
32
  import MigrateTransactionHistoryBySymbol from "./MigrateTransactionHistoryBySymbol.js";
33
+ import MigrateTransactionHistoryBySymbol20251027 from "./MigrateTransactionHistoryBySymbol20251027.js";
32
34
  import MigrateWalletReference from "./MigrateWalletReference.js";
33
35
  export const EVERYTIME = '__everytime__';
34
36
  export const MYTHOS_MIGRATION_KEY = '1.3.21-01';
@@ -69,5 +71,7 @@ export default {
69
71
  // [`${EVERYTIME}-1`]: AutoEnableChainsTokens
70
72
  '1.3.42-01': MigrateNewUnifiedAccount,
71
73
  '1.3.54-01': MigrateChainPatrol,
72
- '1.3.62-01': DeleteEarningData20251010
74
+ '1.3.62-01': DeleteEarningData20251010,
75
+ '1.3.64-01': MigrateAssetSetting20251027,
76
+ '1.3.64-02': MigrateTransactionHistoryBySymbol20251027
73
77
  };