PKT Mining Return Calculator

by 3rror404

HTML

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
<div class="container-fluid py-5 mb-5">

  <div class="row">
    <div class="col">
      <div class="form-group">
        <label>Daily mining rate (per server) (PKT)</label>
        <input type="number" id="txtDailyMiningRate" value="1000" class="form-control">
      </div>
    </div>
  </div>

  <div class="row">
    <div class="col-sm">
      <div class="form-group">
        <label>Monthly server cost (per server) ($)</label>
        <input type="number" id="txtMonthlyServerCost" value="500" class="form-control">
      </div>
    </div>
    <div class="col-sm">
      <div class="form-group">
        <label>Number of servers</label>
        <input type="number" id="txtServerCount" value="3" class="form-control">
      </div>
    </div>
  </div>

 <!--  <div class="row">
    <div class="col">
      <div class="alert alert-info">
        Enter the current coin value or a list of target values
      </div>
  
    </div>
  </div> -->

  <div class="row">
    <div class="col-sm">
      <div class="form-group">
        <label>Current coin value ($)</label>
        <input type="number" id="txtCoinPrice" value="0.05" class="form-control">
      </div>
    </div>
    <div class="col-sm">
      <div class="form-group">
        <label>Target coin values (comma separated) ($)</label>
        <input type="text" id="txtCoinPriceTargets" value="0.05, 0.075, 0.1, 0.25, 0.5, 1, 2.5, 10" class="form-control">
      </div>
    </div>
  </div>
  <div class="row">
    <div class="col">
      <button type="button" id="btnRun" class="btn btn-primary">
        Run
      </button>
    </div>
  </div>
  
  <div class="row">
    <div class="col">
      <div class="alert alert-info mt-3">
        <div class="d-flex...

SCSS

label {
  display: block;
}

.price-table {
  display: table;
  width:100%;
  margin-top: 2rem;
  
  > div {
    display: table-row;
    
    &:nth-child(1) {
      
      span {
        display: block;
      }
      span:nth-child(1) {
         font-weight: bold;
      }
      span:nth-child(2) {
        opacity: .6;
      }
     
    }
    
    > div {
      display: table-cell;
      border: 1px solid #e6e6e6;
      padding: 5px;
      
      &.total {
        background: #d8ffd8;
      }
    }
    
    &:hover {
      > div {
        background: rgba(0,0,0,.05);
        
        &.total {
          background: darken(#d8ffd8, 10%);
        }
      }
    }
  }
}

JavaScript

const DIFFICULTY_PERIOD_DAYS = 100;
const DIFFICULTY_INCREASE_PERCENTAGE = 10;
const DIFFICULTY_DROP_DATE = new Date(2021, 3, 4);
const MINING_START_DATE = new Date(2021, 3, 26);

const txtDailyMiningRate = document.querySelector('#txtDailyMiningRate');
const txtMonthlyServerCost = document.querySelector('#txtMonthlyServerCost');
const txtServerCount = document.querySelector('#txtServerCount');
const txtCoinPrice = document.querySelector('#txtCoinPrice');
const txtCoinPriceTargets = document.querySelector('#txtCoinPriceTargets');
const btnRun = document.querySelector('#btnRun');
const outputTargets = document.querySelector('#output-targets');
const outputROI = document.querySelector('#output-roi');

btnRun.addEventListener('click', run);

function run() { 
  generateTargetsUI(getTargets());
  generateROIUI(getMonthlyROI());
}

function getTargets() {
	let values = [];
  
	if (txtCoinPriceTargets.value != '') {
  	
    const targetPrices = txtCoinPriceTargets.value.split(',');
    
    targetPrices.forEach((coinPrice) => {
    	values.push(calculateYearlyReturn(parseFloat(coinPrice)));
    });
    
  } else {
  	const coinPrice = parseFloat(txtCoinPrice.value)
  	values.push(calculateYearlyReturn(coinPrice));
  }
  
  return values;
}

function getMonthlyROI() {
	const coinPrice = parseFloat(txtCoinPrice.value);
  const monthlyValues = []; 
  
  for (let i = 0; i < 12; i++) {
  	monthlyValues.push(calculateDecliningReturnForMonth(i, coinPrice));
  }	
  
  console.log(monthlyValues, 'Total', monthlyValues.reduce((a, b) => a + b, 0));
  
  return monthlyValues;
}

function calculateYearlyReturn(coinPrice) {
	const dailyRate = txtDailyMiningRate.value;
  const serverCount = parseInt(txtServerCount.value);
  //const coinPrice = parseFloat(txtCoinPrice.value);
  
  const value = {
  		price: coinPrice,
  		raw: (((dailyRate * 365) * coinPrice) * serverCount),
  		converted: (calculateDecliningReturn(coinPrice) * serverCount),
      tokens: dailyRate * 365
  }
 ...