Co-authored-by: sairaj mote <sairajmote3@gmail.com> Co-authored-by: Sai Raj <sairajzero@users.noreply.github.com>
1362 lines
66 KiB
HTML
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> |