JSFiddle - React, Tailwind, and code Playground

JavaScript

var relaysToTokensMultiplier = 1;
var validatorStakeFloorMultiplier = 15000;
var validatorStakeWeightMultiplier = 5;
var servicerStakeWeightCeiling = validatorStakeFloorMultiplier * validatorStakeWeightMultiplier;

var unconsolidatedNodes = [{
    entity: 'A',
    stake: 15000
  }, {
    entity: 'A',
    stake: 15000
  }, {
    entity: 'A',
    stake: 15000
  },
  {
    entity: 'B',
    stake: 15000
  }, {
    entity: 'B',
    stake: 15000
  }, {
    entity: 'B',
    stake: 15000
  },
  {
    entity: 'B',
    stake: 15000
  }, {
    entity: 'B',
    stake: 15000
  }, {
    entity: 'B',
    stake: 15000
  },
  {
    entity: 'B',
    stake: 15000
  }, {
    entity: 'B',
    stake: 15000
  }, {
    entity: 'B',
    stake: 15000
  },
  {
    entity: 'C',
    stake: 15000
  },
  {
    entity: 'D',
    stake: 15000
  }, {
    entity: 'D',
    stake: 15000
  }, {
    entity: 'D',
    stake: 15000
  }
];

var consolidatedNodes = [{
    entity: 'A',
    stake: 45000
  }, {
    entity: 'B',
    stake: 75000
  }, {
    entity: 'B',
    stake: 60000
  },
  {
    entity: 'C',
    stake: 15000
  }, {
    entity: 'D',
    stake: 45000
  }
];

//# 1. Grab validator data
//Validator := k.GetValidator(ctx,address)
//# 2. Grab staked amount
//Stake := validator.getTokens()
//# 3. Floor the staked amount to the lowest multiple of ValidatorStakeFloorMultiplier or the ServicerStakeWeightCeiling, which ever is smaller
//flooredStake := Min(stake.Sub(stake.Mod(ValidatorStakeFloorMultiplier)),(ServicerStakeWeightCeiling))
//# 4. Calculate the weight
//weight := flooredStake.Div(ValidatorStakeFloorMultiplier).Div(ValidatorStakeWeightMultiplier)
//# 5. Calculate the coin emissions for the work done
//coins := k.RelaysToTokensMultiplier(ctx).Mul(relays).Mul(weight)


function calculateRewardsPIP22(node, relays) {
  var stake = node.stake;
  var flooredStake = Math.min(stake - (stake % validatorStakeFloorMultiplier), servicerStakeWeightCeiling);
  var weight = (flooredStake /...