feat(governance): ranking score for all validator types (#2929)
This commit is contained in:
parent
4dcdec7a35
commit
ea91fa1723
@ -50,101 +50,117 @@ export const StandbyPendingValidatorsTable = ({
|
|||||||
const nodes = useMemo(() => {
|
const nodes = useMemo(() => {
|
||||||
if (!data) return [];
|
if (!data) return [];
|
||||||
|
|
||||||
return data.map(
|
return data
|
||||||
({
|
.sort((a, b) => {
|
||||||
id,
|
const aVotingPower = new BigNumber(a.rankingScore.votingPower);
|
||||||
name,
|
const bVotingPower = new BigNumber(b.rankingScore.votingPower);
|
||||||
avatarUrl,
|
return bVotingPower.minus(aVotingPower).toNumber();
|
||||||
stakedByDelegates,
|
})
|
||||||
stakedByOperator,
|
.map((node, index) => {
|
||||||
stakedTotal,
|
const votingPowerRanking = index + 1;
|
||||||
rankingScore: { stakeScore },
|
|
||||||
pendingStake,
|
|
||||||
}) => {
|
|
||||||
const { rawValidatorScore, performanceScore } =
|
|
||||||
getLastEpochScoreAndPerformance(previousEpochData, id);
|
|
||||||
|
|
||||||
const overstakedAmount = getOverstakedAmount(
|
|
||||||
rawValidatorScore,
|
|
||||||
stakedTotal,
|
|
||||||
totalStake
|
|
||||||
);
|
|
||||||
let individualStakeNeededForPromotion,
|
|
||||||
individualStakeNeededForPromotionDescription;
|
|
||||||
|
|
||||||
if (stakeNeededForPromotion && performanceScore) {
|
|
||||||
const stakedTotalBigNum = new BigNumber(stakedTotal);
|
|
||||||
const stakeNeededBigNum = new BigNumber(stakeNeededForPromotion);
|
|
||||||
const performanceScoreBigNum = new BigNumber(performanceScore);
|
|
||||||
|
|
||||||
const calc = stakeNeededBigNum
|
|
||||||
.dividedBy(performanceScoreBigNum)
|
|
||||||
.minus(stakedTotalBigNum);
|
|
||||||
|
|
||||||
if (calc.isGreaterThan(0)) {
|
|
||||||
individualStakeNeededForPromotion = calc.toString();
|
|
||||||
individualStakeNeededForPromotionDescription = t(
|
|
||||||
stakeNeededForPromotionDescription,
|
|
||||||
{
|
|
||||||
prefix: formatNumber(calc, 2).toString(),
|
|
||||||
}
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
individualStakeNeededForPromotion = '0';
|
|
||||||
individualStakeNeededForPromotionDescription = t(
|
|
||||||
stakeNeededForPromotionDescription,
|
|
||||||
{
|
|
||||||
prefix: formatNumber(0, 2).toString(),
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
...node,
|
||||||
|
votingPowerRanking,
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.map(
|
||||||
|
({
|
||||||
id,
|
id,
|
||||||
[ValidatorFields.VALIDATOR]: {
|
name,
|
||||||
avatarUrl,
|
avatarUrl,
|
||||||
name,
|
stakedByDelegates,
|
||||||
},
|
stakedByOperator,
|
||||||
[ValidatorFields.STAKE]: formatNumber(
|
stakedTotal,
|
||||||
toBigNum(stakedTotal, decimals),
|
rankingScore: { stakeScore },
|
||||||
2
|
pendingStake,
|
||||||
),
|
votingPowerRanking,
|
||||||
[ValidatorFields.STAKE_NEEDED_FOR_PROMOTION]:
|
}) => {
|
||||||
individualStakeNeededForPromotion || null,
|
const { rawValidatorScore, performanceScore } =
|
||||||
[ValidatorFields.STAKE_NEEDED_FOR_PROMOTION_DESCRIPTION]:
|
getLastEpochScoreAndPerformance(previousEpochData, id);
|
||||||
individualStakeNeededForPromotionDescription || t('n/a'),
|
|
||||||
[ValidatorFields.STAKE_SHARE]: stakedTotalPercentage(stakeScore),
|
const overstakedAmount = getOverstakedAmount(
|
||||||
[ValidatorFields.STAKED_BY_DELEGATES]: formatNumber(
|
|
||||||
toBigNum(stakedByDelegates, decimals),
|
|
||||||
2
|
|
||||||
),
|
|
||||||
[ValidatorFields.STAKED_BY_OPERATOR]: formatNumber(
|
|
||||||
toBigNum(stakedByOperator, decimals),
|
|
||||||
2
|
|
||||||
),
|
|
||||||
[ValidatorFields.PERFORMANCE_SCORE]:
|
|
||||||
getFormattedPerformanceScore(performanceScore).toString(),
|
|
||||||
[ValidatorFields.PERFORMANCE_PENALTY]:
|
|
||||||
getPerformancePenalty(performanceScore),
|
|
||||||
[ValidatorFields.OVERSTAKED_AMOUNT]: overstakedAmount.toString(),
|
|
||||||
[ValidatorFields.OVERSTAKING_PENALTY]: getOverstakingPenalty(
|
|
||||||
overstakedAmount,
|
|
||||||
totalStake
|
|
||||||
),
|
|
||||||
[ValidatorFields.TOTAL_PENALTIES]: getTotalPenalties(
|
|
||||||
rawValidatorScore,
|
rawValidatorScore,
|
||||||
performanceScore,
|
|
||||||
stakedTotal,
|
stakedTotal,
|
||||||
totalStake
|
totalStake
|
||||||
),
|
);
|
||||||
[ValidatorFields.PENDING_STAKE]: formatNumber(
|
let individualStakeNeededForPromotion,
|
||||||
toBigNum(pendingStake, decimals),
|
individualStakeNeededForPromotionDescription;
|
||||||
2
|
|
||||||
),
|
if (stakeNeededForPromotion && performanceScore) {
|
||||||
};
|
const stakedTotalBigNum = new BigNumber(stakedTotal);
|
||||||
}
|
const stakeNeededBigNum = new BigNumber(stakeNeededForPromotion);
|
||||||
);
|
const performanceScoreBigNum = new BigNumber(performanceScore);
|
||||||
|
|
||||||
|
const calc = stakeNeededBigNum
|
||||||
|
.dividedBy(performanceScoreBigNum)
|
||||||
|
.minus(stakedTotalBigNum);
|
||||||
|
|
||||||
|
if (calc.isGreaterThan(0)) {
|
||||||
|
individualStakeNeededForPromotion = calc.toString();
|
||||||
|
individualStakeNeededForPromotionDescription = t(
|
||||||
|
stakeNeededForPromotionDescription,
|
||||||
|
{
|
||||||
|
prefix: formatNumber(calc, 2).toString(),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
individualStakeNeededForPromotion = '0';
|
||||||
|
individualStakeNeededForPromotionDescription = t(
|
||||||
|
stakeNeededForPromotionDescription,
|
||||||
|
{
|
||||||
|
prefix: formatNumber(0, 2).toString(),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
id,
|
||||||
|
[ValidatorFields.RANKING_INDEX]: votingPowerRanking,
|
||||||
|
[ValidatorFields.VALIDATOR]: {
|
||||||
|
avatarUrl,
|
||||||
|
name,
|
||||||
|
},
|
||||||
|
[ValidatorFields.STAKE]: formatNumber(
|
||||||
|
toBigNum(stakedTotal, decimals),
|
||||||
|
2
|
||||||
|
),
|
||||||
|
[ValidatorFields.STAKE_NEEDED_FOR_PROMOTION]:
|
||||||
|
individualStakeNeededForPromotion || null,
|
||||||
|
[ValidatorFields.STAKE_NEEDED_FOR_PROMOTION_DESCRIPTION]:
|
||||||
|
individualStakeNeededForPromotionDescription || t('n/a'),
|
||||||
|
[ValidatorFields.STAKE_SHARE]: stakedTotalPercentage(stakeScore),
|
||||||
|
[ValidatorFields.STAKED_BY_DELEGATES]: formatNumber(
|
||||||
|
toBigNum(stakedByDelegates, decimals),
|
||||||
|
2
|
||||||
|
),
|
||||||
|
[ValidatorFields.STAKED_BY_OPERATOR]: formatNumber(
|
||||||
|
toBigNum(stakedByOperator, decimals),
|
||||||
|
2
|
||||||
|
),
|
||||||
|
[ValidatorFields.PERFORMANCE_SCORE]:
|
||||||
|
getFormattedPerformanceScore(performanceScore).toString(),
|
||||||
|
[ValidatorFields.PERFORMANCE_PENALTY]:
|
||||||
|
getPerformancePenalty(performanceScore),
|
||||||
|
[ValidatorFields.OVERSTAKED_AMOUNT]: overstakedAmount.toString(),
|
||||||
|
[ValidatorFields.OVERSTAKING_PENALTY]: getOverstakingPenalty(
|
||||||
|
overstakedAmount,
|
||||||
|
totalStake
|
||||||
|
),
|
||||||
|
[ValidatorFields.TOTAL_PENALTIES]: getTotalPenalties(
|
||||||
|
rawValidatorScore,
|
||||||
|
performanceScore,
|
||||||
|
stakedTotal,
|
||||||
|
totalStake
|
||||||
|
),
|
||||||
|
[ValidatorFields.PENDING_STAKE]: formatNumber(
|
||||||
|
toBigNum(pendingStake, decimals),
|
||||||
|
2
|
||||||
|
),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
}, [
|
}, [
|
||||||
data,
|
data,
|
||||||
decimals,
|
decimals,
|
||||||
@ -158,6 +174,12 @@ export const StandbyPendingValidatorsTable = ({
|
|||||||
const StandbyPendingTable = forwardRef<AgGridReact>((_, gridRef) => {
|
const StandbyPendingTable = forwardRef<AgGridReact>((_, gridRef) => {
|
||||||
const colDefs = useMemo<ColDef[]>(
|
const colDefs = useMemo<ColDef[]>(
|
||||||
() => [
|
() => [
|
||||||
|
{
|
||||||
|
field: ValidatorFields.RANKING_INDEX,
|
||||||
|
headerName: '#',
|
||||||
|
width: 60,
|
||||||
|
pinned: 'left',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
field: ValidatorFields.VALIDATOR,
|
field: ValidatorFields.VALIDATOR,
|
||||||
headerName: t(ValidatorFields.VALIDATOR).toString(),
|
headerName: t(ValidatorFields.VALIDATOR).toString(),
|
||||||
|
Loading…
Reference in New Issue
Block a user