@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.
- package/cjs/koni/api/staking/bonding/utils.js +6 -0
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/chain-service/utils/patch.js +1 -1
- package/cjs/services/earning-service/handlers/native-staking/energy.js +60 -6
- package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +1 -4
- package/cjs/services/migration-service/scripts/MigrateTransactionHistoryBySymbol20251027.js +51 -0
- package/cjs/services/migration-service/scripts/databases/MigrateAssetSetting20251027.js +37 -0
- package/cjs/services/migration-service/scripts/index.js +5 -1
- package/koni/api/staking/bonding/utils.d.ts +1 -0
- package/koni/api/staking/bonding/utils.js +5 -0
- package/package.json +16 -6
- package/packageInfo.js +1 -1
- package/services/chain-service/utils/patch.d.ts +1 -1
- package/services/chain-service/utils/patch.js +1 -1
- package/services/earning-service/handlers/native-staking/energy.d.ts +6 -0
- package/services/earning-service/handlers/native-staking/energy.js +60 -8
- package/services/earning-service/handlers/native-staking/relay-chain.js +1 -4
- package/services/migration-service/scripts/MigrateTransactionHistoryBySymbol20251027.d.ts +4 -0
- package/services/migration-service/scripts/MigrateTransactionHistoryBySymbol20251027.js +42 -0
- package/services/migration-service/scripts/databases/MigrateAssetSetting20251027.d.ts +4 -0
- package/services/migration-service/scripts/databases/MigrateAssetSetting20251027.js +29 -0
- 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;
|
package/cjs/packageInfo.js
CHANGED
|
@@ -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.
|
|
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:
|
|
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
|
-
|
|
262
|
-
|
|
263
|
-
|
|
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.
|
|
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.
|
|
2897
|
-
"@subwallet/extension-base": "^1.3.
|
|
2898
|
-
"@subwallet/extension-chains": "^1.3.
|
|
2899
|
-
"@subwallet/extension-dapp": "^1.3.
|
|
2900
|
-
"@subwallet/extension-inject": "^1.3.
|
|
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.
|
|
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.
|
|
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.
|
|
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:
|
|
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
|
-
|
|
255
|
-
|
|
256
|
-
|
|
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,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,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
|
};
|