{"version":3,"sources":["getWeb3.js","context/BlockchainContext.js","context/DisplayContext.js","components/NavBar.js","components/AdminPanel.js","components/UserPanel/TimeLeftField.js","components/UserPanel.js","App.js","serviceWorker.js","index.js"],"names":["a","window","ethereum","web3","Web3","request","method","code","console","log","provider","providers","HttpProvider","connectToWallet","React","createContext","undefined","tokenAddress","tokenImage","addtokentoWallet","params","type","options","address","symbol","decimals","image","NavBar","blockchainContext","useContext","BlockchainContext","accounts","AddressView","substring","length","TokenToWalletView","class","Button","variant","className","onClick","href","src","alt","height","width","data-bs-toggle","data-bs-target","aria-controls","aria-expanded","aria-label","id","aria-current","target","AdminPanel","displayContext","DisplayContext","stakerContract","rewardTokenContract","userDetails","refreshUserDetails","onInputNumberChange","isNonZeroNumber","toast","useState","inputAdminRewards","setInputAdminRewards","inputAdminDuration","setInputAdminDuration","info","parseFloat","error","dismiss","amount","utils","toWei","days","position","autoClose","methods","approve","toString","send","from","addRewards","Container","Form","Control","key","placeholder","value","onChange","e","TimeLeftField","extractTime","part","daysLeft","Math","floor","UserPanel","depositTokenContract","inputStake","setInputStake","inputUnstake","setInputUnstake","deposit","withdraw","claim","numberToFixed","n","toFixed","CardKeyValue","props","label","RewardsPhaseFinished","RewardsPhaseActive","OverlayTrigger","placement","overlay","Tooltip","App","setWeb3","setAccounts","setStakerContract","setDepositTokenContract","setRewardTokenContract","setUserDetails","owner","setOwner","isGlobalLoading","setIsGlobalLoading","isConnectingToWallet","setIsConnectingToWallet","initConnection","networkId","deployedNetwork","StakerContract","networks","instance","eth","Contract","abi","depositToken","call","depositTokenAddr","depositContract","ERC20ABI","rewardToken","rewardTokenAddr","rewardContract","on","_accounts","includes","alert","getFrontendView","res","balanceOf","depBalance","rewardBalance","depSymbol","rewSymbol","parsed","rewardPerDay","deposited","fromWei","pending","depositTokenBalance","rewardTokenBalance","useEffect","load","MainView","style","display","toLowerCase","MainViewOrConnectView","align","disabled","LoadingView","Spinner","animation","Provider","f","re","RegExp","test","_input","hideProgressBar","newestOnTop","closeOnClick","rtl","pauseOnFocusLoss","draggable","pauseOnHover","transition","Slide","Boolean","location","hostname","match","ReactDOM","render","document","getElementById","navigator","serviceWorker","ready","then","registration","unregister"],"mappings":"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","file":"static/js/main.a7c7e18d.chunk.js","sourcesContent":["import Web3 from \"web3\";\n\nasync function connectToWallet() {\n if (window.ethereum) {\n const web3 = new Web3(window.ethereum);\n try {\n // Request account access if needed\n await window.ethereum.request({ method: 'eth_requestAccounts' });\n // Accounts now exposed\n return(web3);\n } catch (error) {\n if (error.code === 4001) {\n //alert(\"Please approve wallet connection if you wish to use the application.\");\n }\n throw(error);\n }\n }\n // Legacy dapp browsers...\n else if (window.web3) {\n // Use Mist/MetaMask's provider.\n const web3 = window.web3;\n console.log(\"Injected web3 detected.\");\n return(web3);\n }\n // Fallback to localhost; use dev console port by default...\n else {\n const provider = new Web3.providers.HttpProvider(\n \"http://127.0.0.1:8545\"\n );\n const web3 = new Web3(provider);\n console.log(\"No web3 instance injected, using Local web3.\");\n return(web3);\n }\n}\n\nexport default connectToWallet;\n","import React from \"react\";\nexport default React.createContext(undefined);","import React from \"react\";\nexport default React.createContext(undefined);","import React, {useContext} from \"react\";\n\nimport BlockchainContext from \"../context/BlockchainContext\";\nimport Button from 'react-bootstrap/Button';\n\n\nconst tokenAddress = '0xbAb3cbDcBCc578445480a79ed80269C50bB5B718';\nconst tokenSymbol = 'MDZA';\nconst tokenDecimals = 18;\nconst tokenImage = 'https://etherscan.io/token/images/medooza_28.png';\n\n async function addtokentoWallet() {\n try {\n // wasAdded is a boolean. Like any RPC method, an error may be thrown.\n const wasAdded =await window.ethereum.request({\n method: 'wallet_watchAsset',\n params: {\n type: 'ERC20', // Initially only supports ERC20, but eventually more!\n options: {\n address: tokenAddress, // The address that the token is at.\n symbol: tokenSymbol, // A ticker symbol or shorthand, up to 5 chars.\n decimals: tokenDecimals, // The number of decimals in the token\n image: tokenImage, // A string url of the token logo\n },\n },\n });\n\n if (wasAdded) {\n console.log('Thanks for your interest!');\n } else {\n console.log('Your loss!');\n }\n } catch (error) {\n console.log(error);\n }\n }\n\nexport default function NavBar() {\n const blockchainContext = useContext(BlockchainContext);\n const { web3, accounts } = blockchainContext;\n\n const AddressView = () => (\n <>\n Connected: {accounts? accounts[0].substring(0,6) : undefined}...{accounts? accounts[0].substring(accounts[0].length-4,accounts[0].length) : undefined}\n \n )\n\n const TokenToWalletView = () => (\n <>\n {
}\n \n )\n\n return (\n <>\n\n
\n \n
\n \n \n \n )\n}","import React, {useContext, useState} from \"react\";\n\nimport BlockchainContext from \"../context/BlockchainContext\";\nimport DisplayContext from \"../context/DisplayContext\";\n\nimport Button from 'react-bootstrap/Button';\nimport Form from 'react-bootstrap/Form';\nimport Container from 'react-bootstrap/Container';\n\n\n\nexport default function AdminPanel() {\n const blockchainContext = useContext(BlockchainContext);\n const displayContext = useContext(DisplayContext);\n const { web3, accounts, stakerContract, rewardTokenContract } = blockchainContext;\n const {userDetails, refreshUserDetails, onInputNumberChange, isNonZeroNumber, toast} = displayContext;\n\n const [inputAdminRewards, setInputAdminRewards] = useState('');\n const [inputAdminDuration, setInputAdminDuration] = useState('');\n\n async function addRewards() {\n if (userDetails[\"daysLeft\"] !== 0.) {\n toast.info(\"Can't add rewards in middle of campaign. Please wait for campaign to finish.\");\n return;\n }\n if (!(isNonZeroNumber(inputAdminRewards) && isNonZeroNumber(inputAdminDuration))) {\n toast.info('Please add missing input.');\n return;\n }\n if (parseFloat(inputAdminRewards) > parseFloat(userDetails[\"rewardTokenBalance\"])) {\n toast.error(\"Not enough balance.\");\n return;\n }\n toast.dismiss();\n let amount = web3.utils.toWei(inputAdminRewards);\n let days = inputAdminDuration;\n try {\n toast.info('Please approve transaction 1 of 2 (allowance)...', {position: 'top-left', autoClose: false});\n await rewardTokenContract.methods.approve(stakerContract.options.address, amount.toString()).send({ from: accounts[0] });\n toast.dismiss();\n toast.info('Please approve transaction 2 of 2 (add rewards)...', {position: 'top-left', autoClose: false});\n await stakerContract.methods.addRewards(amount.toString(), days).send({ from: accounts[0] });\n } finally {\n toast.dismiss();\n }\n \n await refreshUserDetails();\n }\n\n return (\n <>\n \n
\n Admin :: Add {userDetails[\"rewSymbol\"]} Rewards\n
\n\n
Amount
\n
\n Available {userDetails[\"rewSymbol\"]} balance to transfer: {userDetails[\"rewardTokenBalance\"]}\n
\n
\n {onInputNumberChange(e, setInputAdminRewards)}}/>\n
\n

\n\n
Duration (in days)
\n
\n {onInputNumberChange(e, setInputAdminDuration)}}/>\n
\n

\n\n
\n

\n
\n
\n
\n \n )\n}","import React, {useContext} from \"react\";\nimport DisplayContext from \"../../context/DisplayContext\";\n\n\n\nexport default function TimeLeftField() {\n const displayContext = useContext(DisplayContext);\n const {userDetails} = displayContext;\n\n\n function extractTime(part) {\n if (userDetails[\"daysLeft\"] === undefined)\n return \"\";\n \n let daysLeft = userDetails[\"daysLeft\"];\n if (part === \"d\")\n return Math.floor(daysLeft);\n if (part === \"h\")\n return Math.floor((daysLeft - Math.floor(daysLeft)) * 24);\n if (part === \"m\")\n return Math.floor((daysLeft - Math.floor(daysLeft) - Math.floor(daysLeft - Math.floor(daysLeft))) * 60);\n return undefined;\n }\n\n return (\n <>\n
\n
\n Time Left\n
\n
\n
\n
\n {extractTime(\"d\")}\n
\n
\n days\n
\n
\n
\n
\n {extractTime(\"h\")}\n
\n
\n hours\n
\n
\n
\n
\n {extractTime(\"m\")}\n
\n
\n mins\n
\n
\n
\n
\n
\n \n )\n}","import React, {useContext, useState} from \"react\";\nimport BlockchainContext from \"../context/BlockchainContext\";\n\nimport DisplayContext from \"../context/DisplayContext\";\n\nimport TimeLeftField from \"./UserPanel/TimeLeftField\";\n\nimport Button from 'react-bootstrap/Button';\nimport Form from 'react-bootstrap/Form';\nimport Container from 'react-bootstrap/Container';\nimport OverlayTrigger from 'react-bootstrap/OverlayTrigger';\nimport Tooltip from 'react-bootstrap/Tooltip';\n\n\n\nexport default function UserPanel() {\n const blockchainContext = useContext(BlockchainContext);\n const displayContext = useContext(DisplayContext);\n const { web3, accounts, stakerContract, depositTokenContract } = blockchainContext;\n const {userDetails, refreshUserDetails, onInputNumberChange, isNonZeroNumber, toast} = displayContext;\n\n const [inputStake, setInputStake] = useState('');\n const [inputUnstake, setInputUnstake] = useState('');\n\n async function deposit() {\n if (!isNonZeroNumber(inputStake)) {\n toast.error('No amount entered.');\n return;\n }\n if (parseFloat(inputStake) > parseFloat(userDetails[\"depositTokenBalance\"])) {\n console.log(typeof inputStake);\n toast.error(\"Not enough balance.\");\n return;\n }\n toast.dismiss();\n let amount = web3.utils.toWei(inputStake.toString());\n try {\n toast.info('Please approve transaction 1 of 2 (allowance)...', {position: 'top-left', autoClose: false});\n await depositTokenContract.methods.approve(stakerContract.options.address, amount.toString()).send({ from: accounts[0] });\n toast.dismiss();\n toast.info('Please approve transaction 2 of 2 (staking)...', {position: 'top-left', autoClose: false});\n await stakerContract.methods.deposit(amount).send({ from: accounts[0] });\n } finally {\n toast.dismiss();\n }\n setInputStake(\"\");\n await refreshUserDetails();\n }\n \n \n async function withdraw() {\n if (!isNonZeroNumber(inputUnstake)) {\n toast.error('No amount entered.');\n return;\n }\n if (parseFloat(inputUnstake) > parseFloat(userDetails[\"deposited\"])) {\n toast.error(\"Can't unstake more than staked.\");\n return;\n }\n toast.dismiss();\n let amount = web3.utils.toWei(inputUnstake.toString());\n toast.info('Please approve transaction...', {position: 'top-left', autoClose: false});\n try {\n await stakerContract.methods.withdraw(amount).send({ from: accounts[0] });\n } finally {\n toast.dismiss();\n }\n setInputUnstake(\"\");\n await refreshUserDetails();\n }\n \n async function claim() {\n toast.dismiss();\n toast.info('Please approve transaction...', {position: 'top-left', autoClose: false});\n try {\n await stakerContract.methods.claim().send({ from: accounts[0] });\n } finally {\n toast.dismiss();\n }\n await refreshUserDetails();\n }\n\n function numberToFixed(n) {\n if (n === undefined)\n return n;\n return parseFloat(n).toFixed(6);\n }\n \n\n const CardKeyValue = (props) => (\n <>\n
\n
\n {props.label}\n
\n
\n {props.value}\n
\n

\n \n );\n\n const RewardsPhaseFinished = (props) => (\n <>\n
\n
Staking reward period finished
\n
Please check back later for next phase
\n

\n \n );\n\n const RewardsPhaseActive = (props) => (\n <>\n \n \n \n );\n\n return (\n <>\n \n
\n {isNonZeroNumber(userDetails[\"rewardPerDay\"])? : }\n \n \n \n\n

\n
\n Available {userDetails[\"depSymbol\"]} balance to stake: {userDetails[\"depositTokenBalance\"]}\n
\n
\n
\n {onInputNumberChange(e, setInputStake)}}/>\n
\n
\n 0 ? Will also claim pending rewards : <>}>\n \n \n
\n

\n\n
\n {userDetails[\"depSymbol\"]} staked: {userDetails[\"deposited\"]}\n
\n
\n
\n {onInputNumberChange(e, setInputUnstake)}}/>\n
\n
\n 0 ? Will also claim pending rewards : <>}>\n \n \n
\n

\n\n
\n Pending {userDetails[\"rewSymbol\"]} rewards: {userDetails[\"pending\"]}\n
\n
\n \n
\n
\n\n
\n\n \n\n )\n}","import React, { useState, useEffect } from \"react\";\nimport connectToWallet from \"./getWeb3\";\n\nimport StakerContract from \"./contracts/Staker.json\";\nimport ERC20ABI from \"./ERC20ABI.json\";\nimport BlockchainContext from \"./context/BlockchainContext.js\";\nimport DisplayContext from \"./context/DisplayContext.js\";\n\nimport NavBar from \"./components/NavBar\";\nimport AdminPanel from \"./components/AdminPanel\";\nimport UserPanel from \"./components/UserPanel\";\n\nimport { ToastContainer, toast, Slide } from 'react-toastify';\nimport 'react-toastify/dist/ReactToastify.css';\n\nimport Button from 'react-bootstrap/Button';\nimport Spinner from 'react-bootstrap/Spinner'\n\nimport \"./style.css\";\nimport \"./App.css\";\n\nfunction App() {\n const [web3, setWeb3] = useState(undefined);\n const [accounts, setAccounts] = useState(undefined);\n const [stakerContract, setStakerContract] = useState(undefined);\n const [depositTokenContract, setDepositTokenContract] = useState(undefined);\n const [rewardTokenContract, setRewardTokenContract] = useState(undefined);\n\n const [userDetails, setUserDetails] = useState({});\n const [owner, setOwner] = useState(undefined);\n\n const [isGlobalLoading, setIsGlobalLoading] = useState(true);\n const [isConnectingToWallet, setIsConnectingToWallet] = useState(false);\n\n useEffect(() => {\n (async () => {\n setIsGlobalLoading(false);\n /*window.addEventListener(\"load\", async () => {\n try {\n }\n catch(e) {\n\n }\n });*/\n })();\n\n },[]);\n\n\n async function initConnection() {\n try {\n // Get network provider and web3 instance.\n setIsConnectingToWallet(true);\n const web3 = await connectToWallet();\n\n setIsGlobalLoading(true);\n // Use web3 to get the user's accounts.\n const accounts = await window.ethereum.request({ method: 'eth_accounts' });\n\n // Get the contract instance.\n const networkId = await window.ethereum.request({ method: 'net_version' });\n const deployedNetwork = StakerContract.networks[networkId];\n const instance = new web3.eth.Contract(\n StakerContract.abi,\n deployedNetwork && deployedNetwork.address,\n );\n\n const depositTokenAddr = await instance.methods.depositToken().call({ from: accounts[0] });\n const depositContract = new web3.eth.Contract(ERC20ABI, depositTokenAddr);\n\n const rewardTokenAddr = await instance.methods.rewardToken().call({ from: accounts[0] });\n const rewardContract = new web3.eth.Contract(ERC20ABI, rewardTokenAddr);\n\n setWeb3(web3);\n setOwner(await instance.methods.owner().call({ from: accounts[0] }));\n setAccounts(accounts);\n setStakerContract(instance);\n setDepositTokenContract(depositContract);\n setRewardTokenContract(rewardContract);\n\n window.ethereum.on('accountsChanged', function (_accounts) {\n if (_accounts.length === 0) {\n setAccounts(undefined);\n setWeb3(undefined);\n }\n else {\n setAccounts(_accounts);\n }\n });\n \n } catch (error) {\n // Catch any errors for any of the above operations.\n if (error.code === 4001) {\n // User denied access to wallet\n return;\n }\n if (error.toString().includes(\"This contract object doesn't have address set yet\")) {\n toast.error(\"Error: can't load contract. Are you on the right network?\");\n console.error(error);\n return;\n }\n alert(\"Error: can't load web3 connection. Please check console.\");\n console.error(error);\n\n } finally {\n setIsGlobalLoading(false);\n setIsConnectingToWallet(false);\n }\n }\n \n\n useEffect(() => {\n const load = async() => { \n await refreshUserDetails();\n }\n\n if (typeof web3 !== 'undefined'\n && typeof accounts !== 'undefined'\n && typeof stakerContract !== 'undefined'\n && typeof depositTokenContract !== 'undefined'\n && typeof rewardTokenContract !== 'undefined') {\n load();\n }\n }, [web3, accounts, stakerContract, depositTokenContract, rewardTokenContract]) // eslint-disable-line react-hooks/exhaustive-deps\n\n\n async function refreshUserDetails() {\n setIsGlobalLoading(true);\n let res = await stakerContract.methods.getFrontendView().call({ from: accounts[0] });\n let depBalance = await depositTokenContract.methods.balanceOf(accounts[0]).call({ from: accounts[0] });\n let rewardBalance = await rewardTokenContract.methods.balanceOf(accounts[0]).call({ from: accounts[0] });\n let depSymbol = await depositTokenContract.methods.symbol().call({ from: accounts[0] });\n let rewSymbol = await rewardTokenContract.methods.symbol().call({ from: accounts[0] });\n\n let parsed = {\n rewardPerDay: (res[\"_rewardPerSecond\"]*24*60*60/(10**18))\n , daysLeft: (res[\"_secondsLeft\"]/60/60/24)\n , deposited: web3.utils.fromWei(res[\"_deposited\"])\n , pending: web3.utils.fromWei(res[\"_pending\"])\n , depositTokenBalance: web3.utils.fromWei(depBalance)\n , rewardTokenBalance: web3.utils.fromWei(rewardBalance)\n , depSymbol: depSymbol\n , rewSymbol: rewSymbol }\n\n setUserDetails(parsed);\n setIsGlobalLoading(false);\n }\n\n function onInputNumberChange(e, f) {\n const re = new RegExp('^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)$')\n if (e.target.value === '' || re.test(e.target.value)) {\n f(e.target.value);\n }\n }\n\n function isNonZeroNumber(_input) {\n return _input !== undefined && _input !== \"\" && parseFloat(_input) !== 0.0;\n }\n\n const MainView = () => (\n <>\n
\n
\n \n {(accounts && accounts[0].toLowerCase() === owner.toLowerCase())? : undefined}\n
\n \n );\n\n const MainViewOrConnectView = () => (\n <>\n {web3? :

}\n \n )\n\n\n\n const LoadingView = () => (\n <>\n
\n Loading...\n

\n \n\n \n )\n\n return (\n
\n \n \n \n
\n {isGlobalLoading? : }\n\n
\n

\n

\n\n
\n
\n \n
\n \n )\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}