@subwallet/extension-base 1.3.62-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/balance-service/transfer/smart-contract.js +14 -10
- package/cjs/services/balance-service/transfer/xcm/acrossBridge/index.js +0 -6
- package/cjs/services/balance-service/transfer/xcm/utils.js +2 -0
- package/cjs/services/chain-service/constants.js +16 -0
- package/cjs/services/chain-service/utils/index.js +24 -4
- package/cjs/services/chain-service/utils/patch.js +1 -1
- package/cjs/services/earning-service/constants/chains.js +2 -1
- package/cjs/services/earning-service/handlers/native-staking/base-para.js +6 -3
- package/cjs/services/earning-service/handlers/native-staking/energy.js +60 -6
- package/cjs/services/earning-service/handlers/native-staking/tanssi.js +496 -0
- package/cjs/services/earning-service/service.js +4 -0
- package/cjs/services/earning-service/utils/index.js +2 -0
- 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/cjs/services/swap-service/handler/base-handler.js +4 -1
- package/cjs/services/swap-service/handler/chainflip-handler.js +1 -17
- package/cjs/services/swap-service/handler/optimex-handler.js +421 -0
- package/cjs/services/swap-service/handler/simpleswap-handler.js +4 -2
- package/cjs/services/swap-service/index.js +38 -140
- package/cjs/services/swap-service/utils.js +16 -157
- package/cjs/services/transaction-service/helpers/index.js +2 -1
- package/cjs/types/service-base.js +0 -1
- package/cjs/types/swap/index.js +5 -8
- package/cjs/utils/account/common.js +1 -2
- package/koni/api/staking/bonding/utils.d.ts +1 -0
- package/koni/api/staking/bonding/utils.js +5 -0
- package/package.json +26 -6
- package/packageInfo.js +1 -1
- package/services/balance-service/transfer/smart-contract.d.ts +3 -2
- package/services/balance-service/transfer/smart-contract.js +35 -29
- package/services/balance-service/transfer/xcm/acrossBridge/index.d.ts +0 -4
- package/services/balance-service/transfer/xcm/acrossBridge/index.js +0 -4
- package/services/balance-service/transfer/xcm/utils.js +2 -0
- package/services/chain-service/constants.js +16 -0
- package/services/chain-service/utils/index.d.ts +3 -2
- package/services/chain-service/utils/index.js +20 -1
- package/services/chain-service/utils/patch.d.ts +1 -1
- package/services/chain-service/utils/patch.js +1 -1
- package/services/earning-service/constants/chains.d.ts +1 -0
- package/services/earning-service/constants/chains.js +2 -1
- package/services/earning-service/handlers/native-staking/base-para.js +6 -3
- 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/tanssi.d.ts +16 -0
- package/services/earning-service/handlers/native-staking/tanssi.js +478 -0
- package/services/earning-service/service.js +4 -0
- package/services/earning-service/utils/index.js +2 -0
- 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
- package/services/swap-service/handler/base-handler.js +6 -3
- package/services/swap-service/handler/chainflip-handler.d.ts +0 -2
- package/services/swap-service/handler/chainflip-handler.js +2 -18
- package/services/swap-service/handler/optimex-handler.d.ts +43 -0
- package/services/swap-service/handler/optimex-handler.js +410 -0
- package/services/swap-service/handler/simpleswap-handler.js +5 -3
- package/services/swap-service/index.d.ts +0 -1
- package/services/swap-service/index.js +21 -123
- package/services/swap-service/utils.d.ts +6 -12
- package/services/swap-service/utils.js +8 -138
- package/services/transaction-service/helpers/index.js +2 -1
- package/types/service-base.d.ts +3 -4
- package/types/service-base.js +0 -2
- package/types/swap/index.d.ts +3 -1
- package/types/swap/index.js +7 -6
- package/types/yield/info/account/info.d.ts +5 -0
- package/utils/account/common.js +2 -3
|
@@ -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
|
@@ -19,9 +19,10 @@ var _i18next = require("i18next");
|
|
|
19
19
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
20
20
|
// SPDX-License-Identifier: Apache-2.0
|
|
21
21
|
|
|
22
|
-
async function getEVMTransactionObject(
|
|
23
|
-
|
|
22
|
+
async function getEVMTransactionObject(props) {
|
|
23
|
+
const {
|
|
24
24
|
chain,
|
|
25
|
+
data,
|
|
25
26
|
evmApi,
|
|
26
27
|
fallbackFee,
|
|
27
28
|
feeCustom: _feeCustom,
|
|
@@ -31,18 +32,19 @@ async function getEVMTransactionObject(_ref) {
|
|
|
31
32
|
to,
|
|
32
33
|
transferAll,
|
|
33
34
|
value
|
|
34
|
-
} =
|
|
35
|
+
} = props;
|
|
35
36
|
const feeCustom = _feeCustom;
|
|
36
37
|
const feeInfo = _feeInfo;
|
|
37
38
|
const feeCombine = (0, _utils3.combineEthFee)(feeInfo, feeOption, feeCustom);
|
|
38
39
|
let errorOnEstimateFee = '';
|
|
39
40
|
const transactionObject = {
|
|
40
|
-
to
|
|
41
|
-
value
|
|
42
|
-
from
|
|
41
|
+
to,
|
|
42
|
+
value,
|
|
43
|
+
from,
|
|
44
|
+
data,
|
|
43
45
|
...feeCombine
|
|
44
46
|
};
|
|
45
|
-
const
|
|
47
|
+
const gasEstimate = await evmApi.api.eth.estimateGas(transactionObject).catch(e => {
|
|
46
48
|
console.log('Cannot estimate fee with native transfer on', chain, e);
|
|
47
49
|
if (fallbackFee) {
|
|
48
50
|
errorOnEstimateFee = e.message;
|
|
@@ -51,6 +53,8 @@ async function getEVMTransactionObject(_ref) {
|
|
|
51
53
|
throw Error('Unable to estimate fee for this transaction. Edit fee and try again.');
|
|
52
54
|
}
|
|
53
55
|
});
|
|
56
|
+
const gasLimit = Math.floor(gasEstimate * 1.1); // 10% buffer for fluctuations
|
|
57
|
+
|
|
54
58
|
transactionObject.gas = gasLimit;
|
|
55
59
|
let estimateFee;
|
|
56
60
|
if (feeCombine.maxFeePerGas) {
|
|
@@ -66,8 +70,8 @@ async function getEVMTransactionObject(_ref) {
|
|
|
66
70
|
}
|
|
67
71
|
return [transactionObject, transactionObject.value.toString(), errorOnEstimateFee];
|
|
68
72
|
}
|
|
69
|
-
async function getERC20TransactionObject(
|
|
70
|
-
|
|
73
|
+
async function getERC20TransactionObject(props) {
|
|
74
|
+
const {
|
|
71
75
|
assetAddress,
|
|
72
76
|
chain,
|
|
73
77
|
evmApi,
|
|
@@ -79,7 +83,7 @@ async function getERC20TransactionObject(_ref2) {
|
|
|
79
83
|
to,
|
|
80
84
|
transferAll,
|
|
81
85
|
value
|
|
82
|
-
} =
|
|
86
|
+
} = props;
|
|
83
87
|
const erc20Contract = (0, _web.getERC20Contract)(assetAddress, evmApi);
|
|
84
88
|
const feeCustom = _feeCustom;
|
|
85
89
|
let freeAmount = new _bignumber.default(0);
|
|
@@ -4,7 +4,6 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.AcrossErrorMsg = void 0;
|
|
8
7
|
exports._isAcrossChainBridge = _isAcrossChainBridge;
|
|
9
8
|
exports._isAcrossTestnetBridge = _isAcrossTestnetBridge;
|
|
10
9
|
exports.getAcrossQuote = void 0;
|
|
@@ -25,11 +24,6 @@ function _isAcrossChainBridge(srcChain, destChain) {
|
|
|
25
24
|
function _isAcrossTestnetBridge(srcChain) {
|
|
26
25
|
return srcChain === 'base_sepolia' || srcChain === 'arbitrum_sepolia' || srcChain === _chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA;
|
|
27
26
|
}
|
|
28
|
-
const AcrossErrorMsg = {
|
|
29
|
-
AMOUNT_TOO_LOW: 'amount too low',
|
|
30
|
-
AMOUNT_TOO_HIGH: 'amount too high'
|
|
31
|
-
};
|
|
32
|
-
exports.AcrossErrorMsg = AcrossErrorMsg;
|
|
33
27
|
// Calculate fee for across bridge transfer
|
|
34
28
|
const getAcrossQuote = async _ref => {
|
|
35
29
|
let {
|
|
@@ -81,6 +81,7 @@ async function buildXcm(request) {
|
|
|
81
81
|
originChain,
|
|
82
82
|
originTokenInfo,
|
|
83
83
|
recipient,
|
|
84
|
+
sender,
|
|
84
85
|
sendingValue,
|
|
85
86
|
substrateApi
|
|
86
87
|
} = request;
|
|
@@ -93,6 +94,7 @@ async function buildXcm(request) {
|
|
|
93
94
|
}
|
|
94
95
|
const paraSpellChainMap = await (0, _paraspellChainMap.fetchParaSpellChainMap)();
|
|
95
96
|
const bodyData = {
|
|
97
|
+
senderAddress: sender,
|
|
96
98
|
address: recipient,
|
|
97
99
|
from: paraSpellChainMap[originChain.slug],
|
|
98
100
|
to: paraSpellChainMap[destinationChain.slug],
|
|
@@ -80,6 +80,8 @@ const _STAKING_ERA_LENGTH_MAP = {
|
|
|
80
80
|
aleph: 24,
|
|
81
81
|
polkadot: 24,
|
|
82
82
|
kusama: 6,
|
|
83
|
+
statemint: 24,
|
|
84
|
+
statemine: 6,
|
|
83
85
|
westend: 6,
|
|
84
86
|
hydradx: 24,
|
|
85
87
|
default: 24,
|
|
@@ -135,6 +137,8 @@ const _EXPECTED_BLOCK_TIME = {
|
|
|
135
137
|
aleph: 1,
|
|
136
138
|
polkadot: 6,
|
|
137
139
|
kusama: 6,
|
|
140
|
+
statemint: 6,
|
|
141
|
+
statemine: 6,
|
|
138
142
|
polkadex: 12,
|
|
139
143
|
ternoa: 6,
|
|
140
144
|
ternoa_alphanet: 6,
|
|
@@ -241,6 +245,13 @@ const _KNOWN_CHAIN_INFLATION_PARAMS = {
|
|
|
241
245
|
auctionMax: 60,
|
|
242
246
|
stakeTarget: 0.75
|
|
243
247
|
},
|
|
248
|
+
statemine: {
|
|
249
|
+
..._SUBSTRATE_DEFAULT_INFLATION_PARAMS,
|
|
250
|
+
auctionAdjust: 0.3 / 60,
|
|
251
|
+
auctionMax: 60,
|
|
252
|
+
stakeTarget: 0.75
|
|
253
|
+
},
|
|
254
|
+
// todo: recheck
|
|
244
255
|
neatcoin: {
|
|
245
256
|
..._SUBSTRATE_DEFAULT_INFLATION_PARAMS,
|
|
246
257
|
stakeTarget: 0.75
|
|
@@ -254,6 +265,11 @@ const _KNOWN_CHAIN_INFLATION_PARAMS = {
|
|
|
254
265
|
..._SUBSTRATE_DEFAULT_INFLATION_PARAMS,
|
|
255
266
|
stakeTarget: 0.75
|
|
256
267
|
},
|
|
268
|
+
statemint: {
|
|
269
|
+
..._SUBSTRATE_DEFAULT_INFLATION_PARAMS,
|
|
270
|
+
stakeTarget: 0.75
|
|
271
|
+
},
|
|
272
|
+
// todo: recheck
|
|
257
273
|
vara_network: {
|
|
258
274
|
..._SUBSTRATE_DEFAULT_INFLATION_PARAMS,
|
|
259
275
|
stakeTarget: 0.8
|
|
@@ -104,11 +104,12 @@ var _exportNames = {
|
|
|
104
104
|
randomizeProvider: true,
|
|
105
105
|
_isAssetCanPayTxFee: true,
|
|
106
106
|
updateLatestChainInfo: true,
|
|
107
|
+
_chainInfoToAccountChainType: true,
|
|
107
108
|
_chainInfoToChainType: true,
|
|
108
109
|
_isChainInfoCompatibleWithAccountInfo: true,
|
|
109
110
|
_getAssetNetuid: true
|
|
110
111
|
};
|
|
111
|
-
exports._chainInfoToChainType = void 0;
|
|
112
|
+
exports._chainInfoToChainType = exports._chainInfoToAccountChainType = void 0;
|
|
112
113
|
exports._checkSmartContractSupportByChain = _checkSmartContractSupportByChain;
|
|
113
114
|
exports._generateCustomProviderKey = _generateCustomProviderKey;
|
|
114
115
|
exports._getAssetDecimals = _getAssetDecimals;
|
|
@@ -207,11 +208,11 @@ exports._isXcmPathSupported = _isXcmPathSupported;
|
|
|
207
208
|
exports._parseAssetRefKey = _parseAssetRefKey;
|
|
208
209
|
exports._parseMetadataForAssetId = _parseMetadataForAssetId;
|
|
209
210
|
exports._parseMetadataForSmartContractAsset = _parseMetadataForSmartContractAsset;
|
|
210
|
-
exports.findChainInfoByChainId = void 0;
|
|
211
|
-
exports.findChainInfoByHalfGenesisHash = void 0;
|
|
211
|
+
exports.findChainInfoByHalfGenesisHash = exports.findChainInfoByChainId = void 0;
|
|
212
212
|
exports.randomizeProvider = randomizeProvider;
|
|
213
213
|
exports.updateLatestChainInfo = updateLatestChainInfo;
|
|
214
214
|
var _types = require("@subwallet/chain-list/types");
|
|
215
|
+
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
215
216
|
var _constants = require("@subwallet/extension-base/services/chain-service/constants");
|
|
216
217
|
var _types2 = require("@subwallet/extension-base/services/chain-service/types");
|
|
217
218
|
var _types3 = require("@subwallet/extension-base/types");
|
|
@@ -826,7 +827,7 @@ function updateLatestChainInfo(currentDataMap, latestChainInfoList) {
|
|
|
826
827
|
needUpdateChainApiList
|
|
827
828
|
};
|
|
828
829
|
}
|
|
829
|
-
const
|
|
830
|
+
const _chainInfoToAccountChainType = chainInfo => {
|
|
830
831
|
if (_isPureSubstrateChain(chainInfo)) {
|
|
831
832
|
return _types3.AccountChainType.SUBSTRATE;
|
|
832
833
|
}
|
|
@@ -844,6 +845,25 @@ const _chainInfoToChainType = chainInfo => {
|
|
|
844
845
|
}
|
|
845
846
|
return _types3.AccountChainType.SUBSTRATE;
|
|
846
847
|
};
|
|
848
|
+
exports._chainInfoToAccountChainType = _chainInfoToAccountChainType;
|
|
849
|
+
const _chainInfoToChainType = chainInfo => {
|
|
850
|
+
if (_isChainSubstrateCompatible(chainInfo)) {
|
|
851
|
+
return _KoniTypes.ChainType.SUBSTRATE;
|
|
852
|
+
}
|
|
853
|
+
if (_isPureEvmChain(chainInfo)) {
|
|
854
|
+
return _KoniTypes.ChainType.EVM;
|
|
855
|
+
}
|
|
856
|
+
if (_isPureTonChain(chainInfo)) {
|
|
857
|
+
return _KoniTypes.ChainType.TON;
|
|
858
|
+
}
|
|
859
|
+
if (_isPureCardanoChain(chainInfo)) {
|
|
860
|
+
return _KoniTypes.ChainType.CARDANO;
|
|
861
|
+
}
|
|
862
|
+
if (_isPureBitcoinChain(chainInfo)) {
|
|
863
|
+
return _KoniTypes.ChainType.BITCOIN;
|
|
864
|
+
}
|
|
865
|
+
return undefined;
|
|
866
|
+
};
|
|
847
867
|
exports._chainInfoToChainType = _chainInfoToChainType;
|
|
848
868
|
const _isChainInfoCompatibleWithAccountInfo = (chainInfo, accountInfo) => {
|
|
849
869
|
const {
|
|
@@ -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;
|
|
@@ -25,7 +25,8 @@ const _STAKING_CHAIN_GROUP = {
|
|
|
25
25
|
manta: ['manta_network'],
|
|
26
26
|
bittensor: ['bittensor', 'bittensor_testnet'],
|
|
27
27
|
energy: ['energy_web_x_testnet', 'energy_web_x'],
|
|
28
|
-
mythos: ['mythos', 'muse_testnet']
|
|
28
|
+
mythos: ['mythos', 'muse_testnet'],
|
|
29
|
+
tanssi: ['tanssi', 'dancelight']
|
|
29
30
|
};
|
|
30
31
|
exports._STAKING_CHAIN_GROUP = _STAKING_CHAIN_GROUP;
|
|
31
32
|
const RELAY_HANDLER_DIRECT_STAKING_CHAINS = [..._STAKING_CHAIN_GROUP.relay, ..._STAKING_CHAIN_GROUP.assetHub];
|
|
@@ -13,6 +13,7 @@ var _types = require("@subwallet/extension-base/types");
|
|
|
13
13
|
var _utils2 = require("@subwallet/extension-base/utils");
|
|
14
14
|
var _i18next = require("i18next");
|
|
15
15
|
var _util = require("@polkadot/util");
|
|
16
|
+
var _constants = require("../../constants");
|
|
16
17
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
17
18
|
// SPDX-License-Identifier: Apache-2.0
|
|
18
19
|
|
|
@@ -132,9 +133,11 @@ class BaseParaNativeStakingPoolHandler extends _base.default {
|
|
|
132
133
|
const bnChainMinStake = new _util.BN(poolInfo.statistic.earningThreshold.join || '0');
|
|
133
134
|
const bnCollatorMinStake = new _util.BN(targetNomination.validatorMinStake || '0');
|
|
134
135
|
const bnMinStake = _util.BN.max(bnCollatorMinStake, bnChainMinStake);
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
136
|
+
if (!_constants._STAKING_CHAIN_GROUP.tanssi.includes(this.chain)) {
|
|
137
|
+
const existUnstakeErrorMessage = (0, _utils.getExistUnstakeErrorMessage)(this.chain, _KoniTypes.StakingType.NOMINATED);
|
|
138
|
+
if (targetNomination.hasUnstaking) {
|
|
139
|
+
errors.push(new _TransactionError.TransactionError(_types.StakingTxErrorType.EXIST_UNSTAKING_REQUEST, existUnstakeErrorMessage));
|
|
140
|
+
}
|
|
138
141
|
}
|
|
139
142
|
if (!(bnRemainingStake.isZero() || bnRemainingStake.gte(bnMinStake))) {
|
|
140
143
|
errors.push(new _TransactionError.TransactionError(_types.StakingTxErrorType.INVALID_ACTIVE_STAKE));
|
|
@@ -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
|
}
|