economicsystem-mining/index.html
Vivek Teega cf14d1179e 1.0.0 Pre token release version of the economic system
Co-authored-by: sairaj mote <sairajmote3@gmail.com>
Co-authored-by: Sai Raj <sairajzero@users.noreply.github.com>
2022-07-11 18:55:34 +05:30

1362 lines
66 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Mining Economic System</title>
<link rel="stylesheet" href="css/main.css" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;700&family=Roboto+Mono&family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
</head>
<body data-theme="light" class="hide" onload="onLoadStartUp()">
<sm-notifications id="notification_drawer"></sm-notifications>
<audio id="notification_sound">
<source src="https://rmservices.duckdns.org/files/notification-sound.mp3" type="audio/mpeg" />
<source src="https://rmservices.duckdns.org/files/notification-sound.ogg" type="audio/ogg" />
</audio>
<sm-popup id="confirmation_popup">
<h4 id="confirm_title"></h4>
<p id="confirm_message"></p>
<div class="flex align-center">
<sm-button variant="no-outline" class="cancel-btn">Cancel</sm-button>
<sm-button variant="no-outline" class="submit-btn">OK</sm-button>
</div>
</sm-popup>
<sm-popup id="prompt_popup">
<h4 id="prompt_title"></h4>
<p id="prompt_message"></p>
<sm-input id="prompt_input"></sm-input>
<div class="flex align-center">
<sm-button variant="no-outline" class="cancel-btn">Cancel</sm-button>
<sm-button variant="no-outline" class="submit-btn" type="submit">OK</sm-button>
</div>
</sm-popup>
<sm-popup id="sign_in_popup">
<header slot="header" class="popup__header">
<button class="popup__header__close" onclick="hidePopup()">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px"
fill="#000000">
<path d="M0 0h24v24H0V0z" fill="none" />
<path
d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z" />
</svg>
</button>
</header>
<section id="sign_in" class="grid gap-1">
<div class="grid gap-0-5">
<h3>Sign in</h3>
<p>Liking an article supports and encourages the creators.</p>
</div>
<sm-form>
<sm-input id="private_key_field" type="password" placeholder="FLO private key"
error-text="Private key is invalid" data-private-key autofocus required></sm-input>
<sm-button id="sign_in_button" class="cta" variant="primary" disabled>Sign In</sm-button>
</sm-form>
<div class="grid gap-0-5">
<p>New here? Generate your FLO credentials below to continue</p>
<sm-button class="button" onclick="generateCredentials()">
Get FLO credentials
<svg class="icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px"
fill="#000000">
<path d="M0 0h24v24H0z" fill="none" />
<path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z" />
</svg>
</sm-button>
</div>
</section>
<section id="sign_up" class="grid gap-1-5 hide">
<button class="justify-self-start" onclick="goToSignIn()">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px"
fill="#000000">
<path d="M0 0h24v24H0z" fill="none" />
<path d="M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z" />
</svg>
</button>
<div class="grid gap-0-5">
<h3>FLO credentials</h3>
<p>You can use FLO credentials with RanchiMall Times and all RanchiMall FLO apps. </p>
</div>
<div class="grid gap-1-5 card">
<div class="grid gap-0-5">
<h5>FLO ID</h5>
<sm-copy id="generated_flo_id"></sm-copy>
</div>
<div class="grid gap-0-5">
<h5>Private key</h5>
<sm-copy id="generated_private_key"></sm-copy>
</div>
</div>
<sm-button id="sign_up_button" variant="primary">Sign in with these credentials</sm-button>
<strong class="warning">
Keep your private key secure and don't share with anyone.
Once lost there is no way to recover private key.
</strong>
</section>
</sm-popup>
<sm-popup id="user_popup">
<header slot="header" class="popup__header">
<button class="popup__header__close" onclick="hidePopup()">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
<path fill="none" d="M0 0h24v24H0z" />
<path
d="M12 10.586l4.95-4.95 1.414 1.414-4.95 4.95 4.95 4.95-1.414 1.414-4.95-4.95-4.95 4.95-1.414-1.414 4.95-4.95-4.95-4.95L7.05 5.636z" />
</svg>
</button>
<h3>Settings</h3>
</header>
<section class="grid gap-1-5">
<div class="grid gap-1">
<div class="grid">
<h5>Reset App Data?</h5>
</div>
<sm-button id='clearLocalData_button' class="danger cta justify-self-start" onclick="clearLocalData()">Reset Data
</sm-button>
<div class="grid">
<h5>My FLO ID</h5>
<sm-copy id="user_flo_id" clip-text></sm-copy>
</div>
<sm-button id='signout_button' class="danger cta justify-self-start" onclick="signOut()">Sign out
</sm-button>
</div>
<a href="#/dashboard" class="button hide admin-option" onclick="hidePopup()">Admin dashboard</a>
</section>
</sm-popup>
<sm-popup id="tx_popup">
<header slot="header" class="popup__header">
<button class="popup__header__close" onclick="hidePopup()">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
<path fill="none" d="M0 0h24v24H0z" />
<path
d="M12 10.586l4.95-4.95 1.414 1.414-4.95 4.95 4.95 4.95-1.414 1.414-4.95-4.95-4.95 4.95-1.414-1.414 4.95-4.95-4.95-4.95L7.05 5.636z" />
</svg>
</button>
<h3>Transaction Details</h3>
</header>
<section class="grid gap-2">
<div class="grid gap-0-5">
<h5>Consumer ID</h5>
<sm-copy id='tx-popup-consumer-id'>F8dfo322CKzPAyzoFJ6SefHZ9AwAujvKXi</sm-copy>
</div>
<div class="grid gap-0-5">
<h5>Consumer Amount</h5>
<sm-copy id='tx-popup-consumer-amount'>1750</sm-copy>
</div>
<div class="grid gap-0-5">
<h5>Consumer Tokens</h5>
<sm-copy id='tx-popup-consumer-tokens'>5250</sm-copy>
</div>
<div class="grid gap-0-5">
<h5>From date</h5>
<sm-copy id='tx-popup-consumer-fromdate'>2021-12-27</sm-copy>
</div>
<div class="grid gap-0-5">
<h5>To date</h5>
<sm-copy id='tx-popup-consumer-todate'>2021-12-28</sm-copy>
</div>
<div class="grid gap-0-5">
<h5>Investor ID</h5>
<sm-copy id='tx-popup-investor-id'>FSAH5eajsfgXMGENZvpRTbuZTCBDGrTQQx</sm-copy>
</div>
<div class="grid gap-0-5">
<h5>Investor tokens</h5>
<sm-copy id='tx-popup-investor-tokens'>5250</sm-copy>
</div>
<div class="grid gap-0-5">
<h5>Property ID</h5>
<sm-copy id='tx-popup-property-id'>F8BPRSTD2v6PHmKSJK3puPS7jpy3Mm1Ncq</sm-copy>
</div>
<div class="grid gap-0-5">
<h5>Producer tokens</h5>
<sm-copy id='tx-popup-producer-tokens'>5250</sm-copy>
</div>
<div class="grid gap-0-5">
<h5>Referrer ID</h5>
<sm-copy id='tx-popup-referrer-id'></sm-copy>
</div>
<div class="grid gap-0-5">
<h5>Referrer tokens</h5>
<sm-copy id='tx-popup-referrer-tokens'>0</sm-copy>
</div>
<div class="grid gap-0-5">
<h5>Technology provider tokens</h5>
<sm-copy id='tx-popup-technology-tokens'>1750</sm-copy>
</div>
<div class="grid gap-0-5">
<h5>Transaction ID</h5>
<sm-copy id='tx-popup-txid'>z0baa7ff9b7255db4fa59592ab46504ca0dd58d9f9af67dc200c6063a04e338e6c</sm-copy>
</div>
</section>
</sm-popup>
<main>
<header id="main_header" class="flex align-center space-between">
<div id="logo">
<svg id="main_logo" viewBox="0 0 27.25 32">
<title>RanchiMall</title>
<path
d="M27.14,30.86c-.74-2.48-3-4.36-8.25-6.94a20,20,0,0,1-4.2-2.49,6,6,0,0,1-1.25-1.67,4,4,0,0,1,0-2.26c.37-1.08.79-1.57,3.89-4.55a11.66,11.66,0,0,0,3.34-4.67,6.54,6.54,0,0,0,.05-2.82C20,3.6,18.58,2,16.16.49c-.89-.56-1.29-.64-1.3-.24a3,3,0,0,1-.3.72l-.3.55L13.42.94C13,.62,12.4.26,12.19.15c-.4-.2-.73-.18-.72.05a9.39,9.39,0,0,1-.61,1.33s-.14,0-.27-.13C8.76.09,8-.27,8,.23A11.73,11.73,0,0,1,6.76,2.6C4.81,5.87,2.83,7.49.77,7.49c-.89,0-.88,0-.61,1,.22.85.33.92,1.09.69A5.29,5.29,0,0,0,3,8.33c.23-.17.45-.29.49-.26a2,2,0,0,1,.22.63A1.31,1.31,0,0,0,4,9.34a5.62,5.62,0,0,0,2.27-.87L7,8l.13.55c.19.74.32.82,1,.65a7.06,7.06,0,0,0,3.46-2.47l.6-.71-.06.64c-.17,1.63-1.3,3.42-3.39,5.42L6.73,14c-3.21,3.06-3,5.59.6,8a46.77,46.77,0,0,0,4.6,2.41c.28.13,1,.52,1.59.87,3.31,2,4.95,3.92,4.95,5.93a2.49,2.49,0,0,0,.07.77h0c.09.09,0,.1.9-.14a2.61,2.61,0,0,0,.83-.32,3.69,3.69,0,0,0-.55-1.83A11.14,11.14,0,0,0,17,26.81a35.7,35.7,0,0,0-5.1-2.91C9.37,22.64,8.38,22,7.52,21.17a3.53,3.53,0,0,1-1.18-2.48c0-1.38.71-2.58,2.5-4.23,2.84-2.6,3.92-3.91,4.67-5.65a3.64,3.64,0,0,0,.42-2A3.37,3.37,0,0,0,13.61,5l-.32-.74.29-.48c.17-.27.37-.63.46-.8l.15-.3.44.64a5.92,5.92,0,0,1,1,2.81,5.86,5.86,0,0,1-.42,1.94c0,.12-.12.3-.15.4a9.49,9.49,0,0,1-.67,1.1,28,28,0,0,1-4,4.29C8.62,15.49,8.05,16.44,8,17.78a3.28,3.28,0,0,0,1.11,2.76c.95,1,2.07,1.74,5.25,3.32,3.64,1.82,5.22,2.9,6.41,4.38A4.78,4.78,0,0,1,21.94,31a3.21,3.21,0,0,0,.14.92,1.06,1.06,0,0,0,.43-.05l.83-.22.46-.12-.06-.46c-.21-1.53-1.62-3.25-3.94-4.8a37.57,37.57,0,0,0-5.22-2.82A13.36,13.36,0,0,1,11,21.19a3.36,3.36,0,0,1-.8-4.19c.41-.85.83-1.31,3.77-4.15,2.39-2.31,3.43-4.13,3.43-6a5.85,5.85,0,0,0-2.08-4.29c-.23-.21-.44-.43-.65-.65A2.5,2.5,0,0,1,15.27.69a10.6,10.6,0,0,1,2.91,2.78A4.16,4.16,0,0,1,19,6.16a4.91,4.91,0,0,1-.87,3c-.71,1.22-1.26,1.82-4.27,4.67a9.47,9.47,0,0,0-2.07,2.6,2.76,2.76,0,0,0-.33,1.54,2.76,2.76,0,0,0,.29,1.47c.57,1.21,2.23,2.55,4.65,3.73a32.41,32.41,0,0,1,5.82,3.24c2.16,1.6,3.2,3.16,3.2,4.8a1.94,1.94,0,0,0,.09.76,4.54,4.54,0,0,0,1.66-.4C27.29,31.42,27.29,31.37,27.14,30.86ZM6.1,7h0a3.77,3.77,0,0,1-1.46.45L4,7.51l.68-.83a25.09,25.09,0,0,0,3-4.82A12,12,0,0,1,8.28.76c.11-.12.77.32,1.53,1l.63.58-.57.84A10.34,10.34,0,0,1,6.1,7Zm5.71-1.78A9.77,9.77,0,0,1,9.24,7.18h0a5.25,5.25,0,0,1-1.17.28l-.58,0,.65-.78a21.29,21.29,0,0,0,2.1-3.12c.22-.41.42-.76.44-.79s.5.43.9,1.24L12,5ZM13.41,3a2.84,2.84,0,0,1-.45.64,11,11,0,0,1-.9-.91l-.84-.9.19-.45c.34-.79.39-.8,1-.31A9.4,9.4,0,0,1,13.8,2.33q-.18.34-.39.69Z" />
</svg>
<h4>Mining Economic System</h4>
</div>
<theme-toggle></theme-toggle>
<button id="user_login_popup_button" onclick="showPopup('sign_in_popup')">
<svg xmlns="http://www.w3.org/2000/svg" class="icon" enable-background="new 0 0 24 24" height="24px"
viewBox="0 0 24 24" width="24px" fill="#000000">
<g>
<rect fill="none" height="24" width="24" />
</g>
<g>
<path
d="M11,7L9.6,8.4l2.6,2.6H2v2h10.2l-2.6,2.6L11,17l5-5L11,7z M20,19h-8v2h8c1.1,0,2-0.9,2-2V5c0-1.1-0.9-2-2-2h-8v2h8V19z" />
</g>
</svg>
</button>
<button id="user_signout_popup_button" class="hide" onclick="showPopup('user_popup')">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
<path fill="none" d="M0 0h24v24H0z" />
<path
d="M2 12c0-.865.11-1.703.316-2.504A3 3 0 0 0 4.99 4.867a9.99 9.99 0 0 1 4.335-2.505 3 3 0 0 0 5.348 0 9.99 9.99 0 0 1 4.335 2.505 3 3 0 0 0 2.675 4.63c.206.8.316 1.638.316 2.503 0 .865-.11 1.703-.316 2.504a3 3 0 0 0-2.675 4.629 9.99 9.99 0 0 1-4.335 2.505 3 3 0 0 0-5.348 0 9.99 9.99 0 0 1-4.335-2.505 3 3 0 0 0-2.675-4.63C2.11 13.704 2 12.866 2 12zm4.804 3c.63 1.091.81 2.346.564 3.524.408.29.842.541 1.297.75A4.993 4.993 0 0 1 12 18c1.26 0 2.438.471 3.335 1.274.455-.209.889-.46 1.297-.75A4.993 4.993 0 0 1 17.196 15a4.993 4.993 0 0 1 2.77-2.25 8.126 8.126 0 0 0 0-1.5A4.993 4.993 0 0 1 17.195 9a4.993 4.993 0 0 1-.564-3.524 7.989 7.989 0 0 0-1.297-.75A4.993 4.993 0 0 1 12 6a4.993 4.993 0 0 1-3.335-1.274 7.99 7.99 0 0 0-1.297.75A4.993 4.993 0 0 1 6.804 9a4.993 4.993 0 0 1-2.77 2.25 8.126 8.126 0 0 0 0 1.5A4.993 4.993 0 0 1 6.805 15zM12 15a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0-2a1 1 0 1 0 0-2 1 1 0 0 0 0 2z" />
</svg>
</button>
</header>
<nav id="side_nav">
<ul class="nav-list">
<li>
<a href="#dashboard" class="nav-list__item nav-list__item--active interact">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
<path fill="none" d="M0 0h24v24H0z" />
<path
d="M13 21V11h8v10h-8zM3 13V3h8v10H3zm6-2V5H5v6h4zM3 21v-6h8v6H3zm2-2h4v-2H5v2zm10 0h4v-6h-4v6zM13 3h8v6h-8V3zm2 2v2h4V5h-4z" />
</svg>
<span> dashboard </span>
</a>
</li>
<li id="userinfo-nav" class="hide">
<a href="#userinfo" class="nav-list__item interact">
<svg xmlns="http://www.w3.org/2000/svg" class="icon" height="24px" viewBox="0 0 24 24"
width="24px" fill="#000000">
<path d="M0 0h24v24H0V0z" fill="none"></path>
<path
d="M12 5.9c1.16 0 2.1.94 2.1 2.1s-.94 2.1-2.1 2.1S9.9 9.16 9.9 8s.94-2.1 2.1-2.1m0 9c2.97 0 6.1 1.46 6.1 2.1v1.1H5.9V17c0-.64 3.13-2.1 6.1-2.1M12 4C9.79 4 8 5.79 8 8s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4zm0 9c-2.67 0-8 1.34-8 4v3h16v-3c0-2.66-5.33-4-8-4z">
</path>
</svg>
<span> My Tokens </span>
</a>
</li>
<li id="subadmin-nav" class="hide">
<a href="#subadmin" class="nav-list__item interact">
<svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
<path fill="none" d="M0 0h24v24H0z" />
<path
d="M2 12c0-.865.11-1.703.316-2.504A3 3 0 0 0 4.99 4.867a9.99 9.99 0 0 1 4.335-2.505 3 3 0 0 0 5.348 0 9.99 9.99 0 0 1 4.335 2.505 3 3 0 0 0 2.675 4.63c.206.8.316 1.638.316 2.503 0 .865-.11 1.703-.316 2.504a3 3 0 0 0-2.675 4.629 9.99 9.99 0 0 1-4.335 2.505 3 3 0 0 0-5.348 0 9.99 9.99 0 0 1-4.335-2.505 3 3 0 0 0-2.675-4.63C2.11 13.704 2 12.866 2 12zm4.804 3c.63 1.091.81 2.346.564 3.524.408.29.842.541 1.297.75A4.993 4.993 0 0 1 12 18c1.26 0 2.438.471 3.335 1.274.455-.209.889-.46 1.297-.75A4.993 4.993 0 0 1 17.196 15a4.993 4.993 0 0 1 2.77-2.25 8.126 8.126 0 0 0 0-1.5A4.993 4.993 0 0 1 17.195 9a4.993 4.993 0 0 1-.564-3.524 7.989 7.989 0 0 0-1.297-.75A4.993 4.993 0 0 1 12 6a4.993 4.993 0 0 1-3.335-1.274 7.99 7.99 0 0 0-1.297.75A4.993 4.993 0 0 1 6.804 9a4.993 4.993 0 0 1-2.77 2.25 8.126 8.126 0 0 0 0 1.5A4.993 4.993 0 0 1 6.805 15zM12 15a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0-2a1 1 0 1 0 0-2 1 1 0 0 0 0 2z" />
</svg>
<span> Subadmin </span>
</a>
</li>
</ul>
</nav>
<article class="right language-html">
<section id="dashboard" class="page">
<h1 class="page__title">Dashboard</h1>
<p>Details of overall tokens issued</p>
<div class="card-wrapper">
<div class="card">
<h3>Price per MINING</h3>
<p id="flobnb-price">-</p>
</div>
<div class="card">
<h3>Total Amount issued</h3>
<p id="total-amount-issued">-</p>
</div>
<div class="card">
<h3>Total Tokens issued</h3>
<p id="total-tokens-issued">-</p>
</div>
<div class="card">
<h3>Customer tokens</h3>
<p id="total-customer-tokens">-</p>
</div>
<div class="card">
<h3>Service provider tokens</h3>
<p id="total-technology-provider-tokens">-</p>
</div>
</div>
</section>
<section id="userinfo" class="page hide">
<h1 class="page__title">My Token Information</h1>
<p>Information of user <span id='userpage-userfloid'></span></p>
<div class="section__header flex align-center space-between" style="padding: 1rem 0;">
<h3>Summary</h3>
<a href="https://ranchimall.github.io/exchange-market/" class="transaction__link flex align-center"
target="_blank" rel="noopener noreferrer">
<svg class="icon margin-right-0-5" xmlns="http://www.w3.org/2000/svg" height="24px"
viewBox="0 0 24 24" width="24px" fill="#000000">
<path d="M0 0h24v24H0z" fill="none" />
<path
d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z" />
</svg>
Trade
</a>
</div>
<div class="card-wrapper">
<div class="card">
<h3>My Token Valuation</h3>
<p id="total-flobnb-valuation">-</p>
</div>
<div class="card">
<h3>My Total MINING</h3>
<p id="total-flobnb-balance">-</p>
</div>
<div class="card">
<h3>Price per MINING</h3>
<p id="flobnb-price-userpage">-</p>
</div>
<div class="card">
<h3>My MINING on Exchange</h3>
<p id="exchange-flobnb-balance">-</p>
</div>
<div class="card">
<h3>My MINING on Blockchain</h3>
<p id="blockchain-flobnb-balance">-</p>
</div>
</div>
<div class="section__header">
<div class="grid">
<p></p>
<h3>My Transactions</h3>
<p></p>
</div>
</div>
<div id='user-tx-section' class="card-wrapper">
</div>
</section>
<section id="subadmin" class="page hide">
<h1 class="page__title">Subadmin</h1>
<div class="flex align-center space-between">
<h3>Miners Information</h3>
<sm-button onclick="release_tokens()">Release tokens</sm-button>
</div>
<p></p>
<table>
<thead>
<tr>
<th>FLO ID</th>
<th>Tokens to release</th>
<th>Old tokens</th>
<th>New tokens</th>
<th>Old shares</th>
<th>New shares</th>
</tr>
</thead>
<tbody id="approve_new_users"></tbody>
</table>
</section>
</article>
</main>
<template id="tx-card-1">
<div class="transaction-card card">
<h3 class="txcard-type capitalize"></h3>
<p>
<div class="txcard-amount"></div>
<div class="txcard-split"></div>
<div class="txcard-days-stayed"></div>
<div class="txcard-from-to-date"></div>
</p>
</div>
</template>
<template id="tx-card-2">
<div class="transaction-card card">
<h3 class="txcard-type capitalize"></h3>
<p>
<div class="txcard-split"></div>
<div class="txcard-days-stayed"></div>
<div class="txcard-from-to-date"></div>
</p>
</div>
</template>
<template id="miner_status_entry">
<tr class='miner-status-entry'>
<td class="miner-status-entry-floid"></td>
<td class="tokens-to-release"></td>
<td class="old-tokens"></td>
<td class="new-tokens"></td>
<td class="old-shares"></td>
<td class="new-shares"></td>
<td>
<sm-switch></sm-switch>
</td>
</tr>
</template>
<script src="js/main_UI.js"></script>
<script src="js/components.min.js"></script>
<script src="js/floExchangeAPI.js"></script>
<script src="js/floTokenAPI.js"></script>
<script id="floGlobals">
/* Constants for FLO blockchain operations !!Make sure to add this at begining!! */
const floGlobals = {
//Required for all
blockchain: "FLO",
//Required for blockchain API operators
apiURL: {
FLO: ["https://livenet.flocha.in/", "https://flosight.duckdns.org/"],
FLO_TEST: [
"https://testnet-flosight.duckdns.org/",
"https://testnet.flocha.in/",
],
},
adminID: "FKAEdnPfjXLHSYwrXQu377ugN4tXU7VGdf",
sendAmt: 0.001,
fee: 0.0005,
//Required for Supernode operations
SNStorageID: "FNaN9McoBAEFUjkRmNQRYLmBF8SpS7Tgfk",
supernodes: {}, //each supnernode must be stored as floID : {uri:<uri>,pubKey:<publicKey>}
//for cloud apps
subAdmins: [],
application: "TEST_MODE",
appObjects: {},
generalData: {},
lastVC: {},
tokenURL: "https://ranchimallflo.duckdns.org/",
currency: "rupee",
};
</script>
<script id='ui_utils'>
const slideInLeft = [
{
opacity: 0,
transform: 'translateX(1rem)'
},
{
opacity: 1,
transform: 'translateX(0)'
}
]
const slideOutLeft = [
{
opacity: 1,
transform: 'translateX(0)'
},
{
opacity: 0,
transform: 'translateX(-1rem)'
},
]
const slideInRight = [
{
opacity: 0,
transform: 'translateX(-1rem)'
},
{
opacity: 1,
transform: 'translateX(0)'
}
]
const slideOutRight = [
{
opacity: 1,
transform: 'translateX(0)'
},
{
opacity: 0,
transform: 'translateX(1rem)'
},
]
const slideInDown = [
{
opacity: 0,
transform: 'translateY(-1rem)'
},
{
opacity: 1,
transform: 'translateY(0)'
},
]
const slideInUp = [
{
opacity: 0,
transform: 'translateY(1rem)'
},
{
opacity: 1,
transform: 'translateY(0)'
},
]
const slideOutUp = [
{
opacity: 1,
transform: 'translateY(0)'
},
{
opacity: 0,
transform: 'translateY(-1rem)'
},
]
</script>
<script>
const render = {
transactionCard({ userRole, details, vectorClock }) {
const clone = getRef(userRole == 'consumer' ? 'tx-card-1' : 'tx-card-2').content.cloneNode(true).firstElementChild;
clone.querySelector('.txcard-type').textContent = userRole;
clone.dataset.vectorclock = vectorClock;
const {
consumer_amount,
consumer_split,
producer_split,
investor_split,
referrer_split,
days_stayed,
from_date,
to_date
} = details;
clone.querySelector('.txcard-days-stayed').textContent = `${days_stayed} days stayed`;
clone.querySelector('.txcard-from-to-date').textContent = `From ${from_date} to ${to_date}`;
switch (userRole) {
case 'consumer':
clone.querySelector('.txcard-amount').textContent = `${formatAmount(consumer_amount)} spent`;
clone.querySelector('.txcard-split').textContent = `${consumer_split} flobnb# tokens received`;
break;
case 'property':
clone.querySelector('.txcard-split').textContent = `${producer_split} flobnb# tokens received`;
break;
case 'investor':
clone.querySelector('.txcard-split').textContent = `${investor_split} flobnb# tokens received`;
break;
case 'referrer':
clone.querySelector('.txcard-split').textContent = `${referrer_split} flobnb# tokens received`;
break;
}
return clone
},
minerStatusInfo(miner_data) {
let {FLO_ID, pool_acceptance, shares, tokens} = miner_data
let {shares:old_shares, tokens:old_tokens} = floGlobals.appObjects.mining_base.miners[FLO_ID]
const clone = getRef('miner_status_entry').content.cloneNode(true).firstElementChild;
clone.dataset.floId = FLO_ID;
clone.querySelector('.miner-status-entry-floid').textContent = FLO_ID;
clone.querySelector('.tokens-to-release').textContent = tokens - old_tokens;
clone.querySelector('.old-tokens').textContent = old_tokens;
clone.querySelector('.new-tokens').textContent = tokens;
clone.querySelector('.old-shares').textContent = old_shares;
clone.querySelector('.new-shares').textContent = shares;
if(pool_acceptance)
clone.querySelector('sm-switch').setAttribute('checked', '');
return clone;
}
}
function update_element(id, value) {
document.getElementById(id).textContent = value;
}
async function update_overview_ui_data() {
// overview
rates = await floExchangeAPI.getRates();
update_element(
"flobnb-price",
formatAmount(parseFloat(rates.rates['mining']))
);
update_element(
"flobnb-price-userpage",
formatAmount(parseFloat(rates.rates['mining']))
);
update_element(
"total-amount-issued",
formatAmount(parseFloat(localStorage.getItem("total_amount")))
);
update_element(
"total-tokens-issued",
`${localStorage.getItem("total_tokens")} mining#`
);
update_element(
"total-customer-tokens",
`${localStorage.getItem("consumer_split")} mining#`
);
update_element(
"total-technology-provider-tokens",
`${localStorage.getItem("technology_provider_split")} mining#`
);
}
function categorize_userrole_transaction(floid, transaction) {
if (transaction['consumer_floid'] == floid) {
return 'consumer';
}
if (transaction['investor_floid'] == floid) {
return 'investor';
}
if (transaction['property_floid'] == floid) {
return 'property';
}
if (transaction['referrer_floid'] == floid) {
return 'referrer';
}
if (transaction['technology_provider_floid'] == floid) {
return 'technology_provider';
}
}
function create_card(userrole, transaction, vectorclock) {
if (userrole == 'consumer') {
document.getElementById('user-tx-section').innerHTML = `<div class="transaction-card card" data-vectorclock="${vectorclock}">
<h3>Consumer</h3>
<p>
<div>Rs spent : ${transaction.consumer_amount}</div>
<div>Token amount : ${transaction.consumer_split}</div>
<div>Days stayed : ${transaction.days_stayed}</div>
<div>From ${transaction.from_date} to ${transaction.to_date}</div>
</p>
</div>` + document.getElementById('user-tx-section').innerHTML
}
if (userrole == 'property') {
document.getElementById('user-tx-section').innerHTML = `<div class="transaction-card card" data-vectorclock="${vectorclock}">
<h3>Producer</h3>
<p>
<div>Token amount : ${transaction.producer_split}</div>
<div>Days stayed : ${transaction.days_stayed}</div>
<div>From ${transaction.from_date} to ${transaction.to_date}</div>
</p>
</div>` + document.getElementById('user-tx-section').innerHTML
}
if (userrole == 'investor') {
document.getElementById('user-tx-section').innerHTML = `<div class="transaction-card card" data-vectorclock="${vectorclock}">
<h3>Investor</h3>
<p>
<div>Token amount : ${transaction.investor_split}</div>
</p>
</div>` + document.getElementById('user-tx-section').innerHTML
}
if (userrole == 'referrer') {
document.getElementById('user-tx-section').innerHTML = `<div class="transaction-card card" data-vectorclock="${vectorclock}">
<h3>Referrer</h3>
<p>
<div>Token amount : ${transaction.referrer_split}</div>
</p>
</div>` + document.getElementById('user-tx-section').innerHTML
}
}
let transactionsLazyLoader
function render_user_transactions(transaction_dictionary) {
const frag = document.createDocumentFragment();
let arrayOfTransactions = []
for (let vectorClock in transaction_dictionary) {
// do something for each key in the object
let userRole = categorize_userrole_transaction(myFloID, transaction_dictionary[vectorClock])
arrayOfTransactions.push({ userRole, details: transaction_dictionary[vectorClock], vectorClock })
}
transactionsLazyLoader = new LazyLoader('#user-tx-section', arrayOfTransactions, render.transactionCard)
transactionsLazyLoader.init()
}
function update_user_ui_data() {
// User Info
let promise1 = floExchangeAPI.getBalance(myFloID, "mining");
let promise2 = fetch(`https://ranchimallflo.duckdns.org/api/v1.0/getFloAddressBalance?floAddress=${myFloID}&token=mining`);
let promise3 = floExchangeAPI.getRates();
Promise.all([promise1, promise2, promise3]).then((results) => {
update_element("exchange-flobnb-balance", `${parseFloat(results[0].balance)} mining#`);
results[1].json().then((blockchain_data) => {
if (blockchain_data["balance"] == null)
blockchain_data["balance"] = 0;
update_element("blockchain-flobnb-balance", `${parseFloat(blockchain_data["balance"])} mining#`);
update_element("total-flobnb-balance", `${parseFloat(blockchain_data["balance"]) + parseFloat(results[0].balance)} mining#`);
update_element("total-flobnb-valuation", formatAmount((parseFloat(blockchain_data["balance"]) + parseFloat(results[0].balance)) * parseFloat(results[2].rates.mining)));
});
});
// Token split Info
let [floid_balances, floid_transactions] = find_balances_txs_floid(myFloID);
//update_element("total-consumertoken-balance", floid_balances["consumer_amt"]);
//render_user_transactions(floid_transactions);
}
function load_overview_data() {
return new Promise((resolve, reject) => {
let promise1 = floCloudAPI.requestObjectData("flobnb_base", {
callback: (d, e) => null,
});
let promise2 = floCloudAPI.requestGeneralData("flobnb_data", {
senderID: floGlobals.subAdmins,
callback: (d, e) => {
console.log("CALLBACK");
if (e) return;
let consumer_split =
parseFloat(localStorage.getItem("consumer_split")) || 0,
technology_provider_split =
parseFloat(localStorage.getItem("technology_provider_split")) || 0,
total_amount =
parseFloat(localStorage.getItem("total_amount")) || 0,
total_tokens =
parseFloat(localStorage.getItem("total_tokens")) || 0;
for (let v in d) {
consumer_split += d[v].message.consumer_split;
technology_provider_split += d[v].message.technology_provider_split;
total_amount += d[v].message.consumer_amount;
total_tokens += d[v].message.consumer_split + d[v].message.producer_split + d[v].message.investor_split + d[v].message.referrer_split + d[v].message.technology_provider_split;
}
localStorage.setItem("consumer_split", consumer_split);
localStorage.setItem("technology_provider_split", technology_provider_split);
localStorage.setItem("total_amount", total_amount);
localStorage.setItem("total_tokens", total_tokens);
update_overview_ui_data();
},
});
let promise3 = floCloudAPI.requestObjectData("mining_base")
Promise.all([promise1, promise2, promise3])
.then((r) => resolve(r))
.catch((e) => reject(e));
});
}
function fill_tx_popup(vectorclock) {
let key = floCloudAPI.util.filterKey("flobnb_data", {});
const {
consumer_floid,
consumer_amount,
consumer_split,
from_date,
to_date,
investor_floid,
investor_split,
property_floid,
producer_split,
referrer_floid,
referrer_split,
technology_provider_split,
txid
} = floGlobals.generalData[key][vectorclock]['message']
getRef('tx-popup-consumer-id').value = consumer_floid;
getRef('tx-popup-consumer-amount').value = consumer_amount;
getRef('tx-popup-consumer-tokens').value = consumer_split;
getRef('tx-popup-consumer-fromdate').value = from_date;
getRef('tx-popup-consumer-todate').value = to_date;
getRef('tx-popup-investor-id').value = investor_floid;
getRef('tx-popup-investor-tokens').value = investor_split;
getRef('tx-popup-property-id').value = property_floid;
getRef('tx-popup-producer-tokens').value = producer_split;
getRef('tx-popup-referrer-id').value = referrer_floid;
getRef('tx-popup-referrer-tokens').value = referrer_split;
getRef('tx-popup-technology-tokens').value = technology_provider_split;
getRef('tx-popup-txid').value = txid;
}
function generateCredentials() {
const animOptions = {
fill: 'forwards',
duration: 150,
ease: 'easing',
}
const { floID, privKey } = floCrypto.generateNewID()
getRef('generated_flo_id').value = floID
getRef('generated_private_key').value = privKey
getRef('sign_in').animate(slideOutLeft, animOptions).onfinish = () => {
getRef('sign_in').classList.add('hide')
getRef('sign_up').classList.remove('hide')
getRef('sign_up').animate(slideInLeft, animOptions)
}
}
function goToSignIn() {
const animOptions = {
fill: 'forwards',
duration: 150,
ease: 'easing',
}
getRef('sign_up').animate(slideOutRight, animOptions).onfinish = () => {
getRef('sign_in').classList.remove('hide')
getRef('sign_in').animate(slideInRight, animOptions)
getRef('sign_up').classList.add('hide')
}
}
function getSignedIn() {
return new Promise((resolve, reject) => {
getRef('sign_in_button').onclick = () => {
resolve(getRef('private_key_field').value.trim())
getRef('private_key_field').value = ''
hidePopup()
notify('Signed in', 'success')
}
getRef('sign_up_button').onclick = () => {
getConfirmation('Sign in?', 'Make sure you have copied your private key.')
.then((res) => {
if (res) {
resolve(getRef('generated_private_key').value.trim())
getRef('generated_private_key').value = ''
hidePopup()
notify('Signed in', 'success')
}
})
}
})
}
async function signOut() {
getConfirmation('Sign out?', 'You are about to sign out of the app, continue?', 'Stay', 'Leave')
.then(async (res) => {
if (res) {
await floDapps.clearCredentials()
location.reload()
}
})
}
function clearLocalData(){
floDapps.deleteAppData(false).then(r => {
localStorage.removeItem("consumer_split");
localStorage.removeItem("producer_split");
localStorage.removeItem("investor_split");
localStorage.removeItem("referrer_split");
localStorage.removeItem("technology_provider_split");
localStorage.removeItem("total_amount");
localStorage.removeItem("total_tokens");
location.reload();
})
}
async function confirmSubmitForm() {
getConfirmation('Confirm', 'Have you crossed checked & confirmed the data is right', "I'll re-check", 'Yes, I have')
.then(async (res) => {
if (res) {
submit_customer_form()
}
})
}
</script>
<script id="onLoadStartUp">
function formatAmount(amount) {
return amount.toLocaleString(`en-IN`, {
style: "currency",
currency: "INR",
});
}
function ascii_to_hex(str){
var arr1 = [];
for (var n = 0, l = str.length; n < l; n ++) {
var hex = Number(str.charCodeAt(n)).toString(16);
arr1.push(hex);
}
return arr1.join('');
}
function range_check(lower_range, upper_range, value) {
if (lower_range == 0) {
var truth_value = value >= lower_range && value <= upper_range;
} else {
var truth_value = value > lower_range && value <= upper_range;
}
return truth_value;
}
function return_rangenumbers(i, schedule_keys, schedule) {
if (i == 0) {
rangenumber = 0;
next_rangenumber = parseFloat(schedule_keys[i]);
token_release_amount_per_rupee = schedule[schedule_keys[i]];
} else if (schedule_keys[i] != "beyond") {
rangenumber = parseFloat(schedule_keys[i - 1]);
next_rangenumber = parseFloat(schedule_keys[i]);
token_release_amount_per_rupee = schedule[schedule_keys[i]];
} else {
rangenumber = parseFloat(schedule_keys[i - 1]);
next_rangenumber = Infinity;
token_release_amount_per_rupee = schedule[schedule_keys[i]];
}
return [rangenumber, next_rangenumber, token_release_amount_per_rupee];
}
function find_range_details(current_amount, tentative_amount) {
schedule = floGlobals.appObjects["token_distribution_schedule1"];
lowernumber = current_amount;
uppernumber = tentative_amount;
range_detail_list = new Array();
schedule_keys = Object.keys(schedule);
temp_lower = 0;
for (let i = 0; i < schedule_keys.length; i++) {
// Find the starting point
var [rangenumber, next_rangenumber] = return_rangenumbers(
i,
schedule_keys,
schedule
);
var range_item = new Array();
if (temp_lower == 0) {
if (lowernumber >= rangenumber && lowernumber <= next_rangenumber) {
range_item.push(`${rangenumber}-${next_rangenumber}`);
range_item.push(schedule[next_rangenumber]);
range_item.push(next_rangenumber - lowernumber);
range_detail_list.push(range_item);
temp_lower = 1;
}
} else if (temp_lower == 1) {
//either full
if (lowernumber < rangenumber && uppernumber >= next_rangenumber) {
range_item.push(`${rangenumber}-${next_rangenumber}`);
range_item.push(schedule[next_rangenumber]);
range_item.push(next_rangenumber - rangenumber);
range_detail_list.push(range_item);
}
// or partial overflow
else if (
uppernumber > rangenumber &&
uppernumber < next_rangenumber
) {
range_item.push(`${rangenumber}-${next_rangenumber}`);
range_item.push(schedule[next_rangenumber]);
range_item.push(uppernumber - rangenumber);
range_detail_list.push(range_item);
}
}
}
return range_detail_list;
}
function find_range_details1(current_amount, tentative_amount) {
schedule = floGlobals.appObjects["flobnb_base"]["distribution"];
range_detail_list = new Array();
schedule_keys = Object.keys(schedule);
found_lowerrange = false;
current_amount_range = null;
tentative_amount_range = null;
for (let i = 0; i < schedule_keys.length; i++) {
// Find the starting point
var [rangenumber, next_rangenumber, token_release_amount_per_rupee] = return_rangenumbers(i, schedule_keys, schedule);
//console.log(`${rangenumber}-${next_rangenumber} ${token_release_amount_per_rupee}`)
var range_item = new Array();
// check if current amount falls in the range
if (
!found_lowerrange &&
range_check(rangenumber, next_rangenumber, current_amount)
) {
if (range_check(rangenumber, next_rangenumber, tentative_amount)) {
range_item.push(`${rangenumber}-${next_rangenumber}`);
range_item.push(token_release_amount_per_rupee);
range_item.push(tentative_amount - current_amount);
range_detail_list.push(range_item);
break;
} else {
range_item.push(`${rangenumber}-${next_rangenumber}`);
range_item.push(token_release_amount_per_rupee);
range_item.push(next_rangenumber - current_amount);
range_detail_list.push(range_item);
found_lowerrange = true;
continue;
}
}
// check if tentative_amount falls in the range
if (found_lowerrange) {
if (range_check(rangenumber, next_rangenumber, tentative_amount)) {
range_item.push(`${rangenumber}-${next_rangenumber}`);
range_item.push(token_release_amount_per_rupee);
range_item.push(tentative_amount - rangenumber);
range_detail_list.push(range_item);
break;
} else {
range_item.push(`${rangenumber}-${next_rangenumber}`);
range_item.push(token_release_amount_per_rupee);
range_item.push(next_rangenumber - rangenumber);
range_detail_list.push(range_item);
}
}
}
return range_detail_list;
}
function findCurrentAmount() {
let cur_amt = 0;
let fk = floCloudAPI.util.filterKey("flobnb_data", {});
for (let d in floGlobals.generalData[fk])
cur_amt += floGlobals.generalData[fk][d].message.consumer_amount;
return cur_amt;
}
function find_balances_txs_floid(floID) {
let floid_balances = {
consumer_amt: 0,
referrer_amt: 0
};
let floid_transactions = {};
let fk = floCloudAPI.util.filterKey("flobnb_data", {});
for (let d in floGlobals.generalData[fk]) {
if (floGlobals.generalData[fk][d].message.consumer_floid == floID) {
floid_balances["consumer_amt"] +=
floGlobals.generalData[fk][d].message.consumer_split;
floid_transactions[d] = floGlobals.generalData[fk][d].message
}
if (floGlobals.generalData[fk][d].message.referrer_floid == floID) {
floid_balances["referrer_amt"] +=
floGlobals.generalData[fk][d].message.referrer_split;
floid_transactions[d] = floGlobals.generalData[fk][d].message
}
}
return [floid_balances, floid_transactions];
}
function processData(data) {
return new Promise((resolve, reject) => {
if (!floGlobals.subAdmins.includes(myFloID))
return reject("Access denied");
// calculations based on the consumer amount
let current_amount = findCurrentAmount();
let tentative_amount =
current_amount + parseFloat(data.consumer_amount);
let range_details = find_range_details1(
current_amount,
tentative_amount
);
let flobnb_tokens_tobereleased = 0;
range_details.forEach((element) => {
flobnb_tokens_tobereleased += element[2] * element[1];
});
// split the tokens
if (data.referrer_floid == "")
split_info =
floGlobals.appObjects.flobnb_base.splits.without_referrer;
else
split_info = floGlobals.appObjects.flobnb_base.splits.with_referrer;
data.consumer_split =
split_info.consumer * flobnb_tokens_tobereleased;
data.producer_split =
split_info.producer * flobnb_tokens_tobereleased;
data.investor_split =
split_info.investor * flobnb_tokens_tobereleased;
data.referrer_split =
split_info.referrer * flobnb_tokens_tobereleased;
data.technology_provider_split =
split_info.technology_provider * flobnb_tokens_tobereleased;
let rmtID = floGlobals.appObjects["flobnb_base"]["rmt_ownerID"];
let receivers = {};
receivers[rmtID] = data.technology_provider_split;
receivers[data.property_floid] =
(receivers[data.property_floid] || 0) + data.producer_split;
receivers[data.consumer_floid] =
(receivers[data.consumer_floid] || 0) + data.consumer_split;
receivers[data.investor_floid] =
(receivers[data.investor_floid] || 0) + data.investor_split;
if (data.referrer_split)
receivers[data.referrer_floid] =
(receivers[data.referrer_floid] || 0) + data.referrer_split;
floExchangeAPI
.transferToken(receivers, "flobnb", myFloID, myPrivKey)
.then((txid) => {
let sensitiveData = {
consumer_name: data.consumer_name,
consumer_upi_address: data.consumer_upi_address,
consumer_email: data.consumer_email,
referrer_name: data.referrer_name,
};
let cloudData = {
privacy_data: floCrypto.encryptData(
JSON.stringify(sensitiveData),
floGlobals.appObjects["flobnb_base"]["encrypt_key"]
),
consumer_floid: data.consumer_floid,
consumer_amount: data.consumer_amount,
consumer_split: data.consumer_split,
investor_floid: data.investor_floid,
investor_split: data.investor_split,
property_floid: data.property_floid,
producer_split: data.producer_split,
referrer_floid: data.referrer_floid,
referrer_split: data.referrer_split,
technology_provider_split: data.technology_provider_split,
flobnb_distributed: flobnb_tokens_tobereleased,
txid: txid,
from_date: data.from_date,
to_date: data.to_date,
days_stayed: data.days_stayed,
};
floCloudAPI
.sendGeneralData(cloudData, "flobnb_data")
.then((result) => resolve(result))
.catch((error) => reject(error));
})
.catch((error) => reject(error));
});
}
function submit_customer_form() {
console.log("clicked");
document.getElementById('subadmin-form-submit-button').disabled = true;
data = {
consumer_floid: document.getElementById("subadmin-form-floID").value,
consumer_name: document.getElementById("subadmin-form-name").value,
consumer_upi_address: document.getElementById("subadmin-form-upiID").value,
consumer_email: document.getElementById("subadmin-form-email").value,
consumer_amount: parseFloat(document.getElementById("subadmin-form-amount").value),
investor_floid: document.getElementById("subadmin-form-investorFLOID").value,
property_floid: document.getElementById("subadmin-form-propertyFLOID").value,
days_stayed: document.getElementById("subadmin-form-numberOfDays").value,
referrer_floid: document.getElementById("subadmin-form-referrerFLOID").value,
referrer_name: document.getElementById("subadmin-form-referrerName").value,
from_date: document.getElementById("subadmin-form-fromDate").value,
to_date: document.getElementById("subadmin-form-toDate").value,
};
processData(data)
.then((result) => {
console.log(result);
document.getElementById("subadmin-form").reset();
document.getElementById('subadmin-form-submit-button').disabled = false;
})
.catch((error) => {
console.error(error);
alert(error);
});
}
function find_unregistered_floids(mining_user_data){
var unregistered_floids = [];
var registered_floids = Object.keys(floGlobals.appObjects.mining_base.miners);
for (var i = 0; i < mining_user_data.length; i++) {
if (!registered_floids.includes(mining_user_data[i].coin_address)) {
unregistered_floids.push(mining_user_data[i])
}
}
return unregistered_floids
}
async function find_user_diff_shares(id){
const user_shares_details = await fetch(`https://miningapitest.duckdns.org/getUserShares?id={id}`)
return await user_shares_details.json()
}
function render_miner_status(api_miner_data){
floGlobals.minersData = api_miner_data;
const frag = document.createDocumentFragment();
for (const key in api_miner_data){
frag.append(render.minerStatusInfo(api_miner_data[key]))
}
document.getElementById("approve_new_users").append(frag);
}
document.getElementById('approve_new_users').addEventListener('change', e => {
const allow = e.target.value ? 1: 0;
const floID = e.target.closest('.miner-status-entry').dataset.floId
const data = `${floID}${allow}`
const signature = floCrypto.signData(data, myPrivKey)
fetch(`https://miningapitest.duckdns.org/change?flo_id=${floID}&status=${allow}&signature=${signature}`, { method:"POST"})
.then((res) => {
console.log(res)
})
.catch(err => {
console.error(err)
e.target.value = !allow;
})
})
async function initialize_new_users(data){
await floCloudAPI.requestObjectData('mining_base')
present_users = Object.keys(floGlobals.appObjects.mining_base.miners)
Object.keys(data).forEach(function(key){
if(!present_users.includes(data[key]['FLO_ID'])){
let { FLO_ID, account_id, pool_acceptance, shares, tokens, username} = data[key]
// update user details
floGlobals.appObjects.mining_base['miners'][FLO_ID] = {
'account_id': account_id,
'shares':0,
'tokens':0,
'username':username }
}
})
await floCloudAPI.updateObjectData("mining_base")
}
function release_tokens(){
getConfirmation('Release the tokens?').then(res => {
if(res){
receivers = {}
for(const key in floGlobals.minersData){
const {tokens, FLO_ID, shares} = floGlobals.minersData[key]
let tokens_to_release = tokens - floGlobals.appObjects.mining_base.miners[FLO_ID]['tokens']
console.log(`User ${FLO_ID}`)
console.log(`tokens to release : ${tokens_to_release}`)
// code to release tokens on the RanchiMall Exchange
if (tokens_to_release != 0){
receivers[FLO_ID] = tokens_to_release
}
}
floExchangeAPI
.transferToken(receivers, "mining", myFloID, myPrivKey)
.then((txid) => {
let sensitiveData = {
consumer_name: data.consumer_name,
consumer_upi_address: data.consumer_upi_address,
consumer_email: data.consumer_email,
referrer_name: data.referrer_name,
};
let cloudData = {
privacy_data: floCrypto.encryptData(
JSON.stringify(sensitiveData),
floGlobals.appObjects["flobnb_base"]["encrypt_key"]
),
consumer_floid: data.consumer_floid,
consumer_amount: data.consumer_amount,
consumer_split: data.consumer_split,
investor_floid: data.investor_floid,
investor_split: data.investor_split,
property_floid: data.property_floid,
producer_split: data.producer_split,
referrer_floid: data.referrer_floid,
referrer_split: data.referrer_split,
technology_provider_split: data.technology_provider_split,
flobnb_distributed: flobnb_tokens_tobereleased,
txid: txid,
from_date: data.from_date,
to_date: data.to_date,
days_stayed: data.days_stayed,
};
floCloudAPI
.sendGeneralData(cloudData, "flobnb_data")
.then((result) => resolve(result))
.catch((error) => reject(error));
})
.catch((error) => reject(error));
}
})
}
async function onLoadStartUp() {
//floDapps.addStartUpFunction('Sample', Promised Function)
//floDapps.setAppObjectStores({sampleObs1:{}, sampleObs2:{options{autoIncrement:true, keyPath:'SampleKey'}, Indexes:{sampleIndex:{}}}})
//floDapps.setCustomPrivKeyInput( () => { FUNCTION BODY *must resolve private key* } )
//floDapps.setAppObjectStores({ images: {} })
floDapps.setCustomPrivKeyInput(getSignedIn)
floDapps.setMidStartup(load_overview_data)
await floExchangeAPI.init("FMxYC7gYZhouzqtHZukGnPiQ8nvG4CMzXM", "exchange")
//document.getElementById('subadmin-form-submit-button').addEventListener("click", submit_customer_form)
floDapps.launchStartUp().then((result) => {
console.log(result);
window.location.hash = '#userinfo';
getRef('user_flo_id').value = myFloID
getRef('user_login_popup_button').classList.add('hide')
getRef('userpage-userfloid').innerText = myFloID
getRef('user_signout_popup_button').classList.remove('hide')
// Check if subadmin
if (floGlobals.subAdmins.includes(myFloID)) {
console.log('This is a subadmin')
document.getElementById('subadmin-nav').classList.remove('hide')
}
/*
getRef('user-tx-section').addEventListener('click', event => {
if (event.target.closest(".transaction-card")) {
const vectorclock = event.target.closest(".transaction-card").dataset.vectorclock
console.log(vectorclock)
console.log(event.target)
fill_tx_popup(vectorclock)
showPopup('tx_popup')
}
})
*/
// Show userinfo
document.getElementById('userinfo-nav').classList.remove('hide')
document.getElementById('userinfo-nav').click()
update_user_ui_data()
//App functions....
fetch('https://miningapitest.duckdns.org/getUsers')
.then(response => response.json())
.then(data => {
// Check if all the user data is present in the cloud object
console.log('user data')
console.log(data)
//let unregistered_floids = find_unregistered_floids(data['users'])
initialize_new_users(data)
// pass the api data to rendering function
render_miner_status(data)
})
.catch(error => console.error('Error:', error))
}).catch((error) => console.error(error));
}
</script>
<script src="https://ranchimall.github.io/Standard_Operations/lib.js"></script>
<script src="https://ranchimall.github.io/Standard_Operations/floCrypto.js"></script>
<script src="https://ranchimall.github.io/Standard_Operations/floBlockchainAPI.js"></script>
<script src="https://ranchimall.github.io/Standard_Operations/compactIDB.js"></script>
<script src="https://ranchimall.github.io/Standard_Operations/floCloudAPI.js"></script>
<script src="https://ranchimall.github.io/Standard_Operations/floDapps.js"></script>
</body>
</html>