{"version":3,"sources":["magic.js","components/Login.js","components/Loading.js","components/Callback.js","components/ContractCall.js","components/SendTransaction.js","components/Info.js","contract/abi.js","components/Home.js","components/App.js","index.js"],"names":["magicMatic","Magic","process","network","rpcUrl","chainId","maticWeb3","Web3","rpcProvider","magicEthereum","ethWeb3","Login","useState","email","setEmail","isLoggingIn","setIsLoggingIn","history","useHistory","login","useCallback","a","auth","loginWithMagicLink","redirectURI","URL","window","location","origin","href","push","handleInputOnChange","event","target","value","className","type","name","required","placeholder","onChange","disabled","onClick","Loading","Callback","useEffect","loginWithCredential","finally","ContractCall","user","fetchBalance","message","contract","fetchContractMessage","newMessage","setNewMessage","setDisabled","txnHash","setTxnHash","updateBtnRef","useRef","updateContractMessage","disableForm","methods","update","send","from","publicAddress","receipt","transactionHash","enableForm","current","innerText","e","ref","SendTransaction","web3","toAddress","setToAddress","amount","setAmount","sendTxBtnRef","sendTransaction","eth","to","utils","toWei","Info","magic","handleChangeNetwork","balance","logout","then","toString","substring","abi","Home","setMagic","userMetadata","setUserMetadata","setBalance","Contract","setMessage","isLoggedIn","magicIsLoggedIn","getMetadata","address","getBalance","bal","fromWei","call","App","path","exact","component","render","document","getElementById"],"mappings":"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","file":"static/js/main.ea8298c6.chunk.js","sourcesContent":["import { Magic } from 'magic-sdk';\nimport Web3 from 'web3';\n\n/** \n * NOTE: when connecting to a testnet, TEST API keys must be used from the Magic dashboard (live API keys for eth mainnet)\n */\n\n const customNodeOptions = {\n rpcUrl: 'https://rpc-mainnet.maticvigil.com/', // Polygon RPC URL\n chainId: 137, // Polygon chain id\n}\n\n// Setting network to Matic\nexport const magicMatic = new Magic(process.env.REACT_APP_MAGIC_PUBLISHABLE_KEY, { network: customNodeOptions });\nmagicMatic.network = \"matic\"\n\nexport const maticWeb3 = new Web3(magicMatic.rpcProvider);\n\n// Setting network to Ethereum (Ropsten Testnet)\nexport const magicEthereum = new Magic(process.env.REACT_APP_MAGIC_PUBLISHABLE_KEY, { network: 'ropsten' });\nmagicEthereum.network = \"ethereum\"\n\nexport const ethWeb3 = new Web3(magicEthereum.rpcProvider);","import React, { useCallback, useState } from \"react\";\nimport { useHistory } from \"react-router\";\nimport { magicEthereum } from \"../magic\";\n\nexport default function Login() {\n const [email, setEmail] = useState(\"\");\n const [isLoggingIn, setIsLoggingIn] = useState(false);\n const history = useHistory();\n\n /**\n * Perform login action via Magic's passwordless flow. Upon successuful\n * completion of the login flow, a user is redirected to the homepage.\n */\n const login = useCallback(async () => { \n setIsLoggingIn(true);\n\n try {\n await magicEthereum.auth.loginWithMagicLink({\n email,\n redirectURI: new URL(\"/callback\", window.location.origin).href,\n });\n history.push(\"/\");\n } catch {\n setIsLoggingIn(false);\n }\n }, [email]);\n\n /**\n * Saves the value of our email input into component state.\n */\n const handleInputOnChange = useCallback(event => {\n setEmail(event.target.value);\n }, []);\n\n return (\n
\n

Please sign up or login

\n \n \n
\n );\n}\n\n","import React from \"react\";\n\nexport default function Loading() {\n return (\n
\n

Loading...

\n
\n );\n}\n\n","import React, { useEffect } from \"react\";\nimport { useHistory } from \"react-router\";\nimport { magicEthereum } from \"../magic\";\nimport Loading from \"./Loading\";\n\nexport default function Callback() {\n const history = useHistory();\n\n useEffect(() => {\n // On mount, we try to login with a Magic credential in the URL query.\n magicEthereum.auth.loginWithCredential().finally(() => {\n history.push(\"/\");\n });\n }, []);\n\n return ;\n}\n\n","import React, { useState, useRef } from \"react\";\n\nexport default function ContractCall({ network, user, fetchBalance, message, contract, fetchContractMessage }) {\n const [newMessage, setNewMessage] = useState('');\n const [disabled, setDisabled] = useState(false);\n const [txnHash, setTxnHash] = useState();\n const updateBtnRef = useRef();\n\n // Update contract `message` value on the blockchain\n const updateContractMessage = async () => {\n if (!newMessage) return;\n disableForm();\n const receipt = await contract.methods.update(newMessage).send({ from: user.publicAddress });\n setTxnHash(receipt.transactionHash);\n enableForm();\n }\n\n // Disable input form while the transaction is being confirmed\n const disableForm = () => {\n setTxnHash(); // Clear link to previous transaction hash\n setDisabled(true);\n updateBtnRef.current.innerText = 'Submitted...';\n }\n\n // Re-enable input form once the transaction is confirmed\n const enableForm = () => {\n setDisabled(false);\n setNewMessage('');\n fetchBalance(user.publicAddress);\n fetchContractMessage()\n updateBtnRef.current.innerText = 'Update';\n }\n\n\n return (\n
\n

Contract Message

\n
{message}
\n\n

Update Message

\n setNewMessage(e.target.value)} className=\"full-width\" placeholder=\"New Message\" />\n \n {\n txnHash &&\n
\n \n View Transaction\n ↗️\n
\n }\n
\n )\n}","import React, { useState, useRef } from \"react\";\n\nexport default function SendTransaction({ web3, network, publicAddress, fetchBalance }) {\n const [toAddress, setToAddress] = useState('');\n const [amount, setAmount] = useState('');\n const [disabled, setDisabled] = useState(false);\n const [txnHash, setTxnHash] = useState();\n\n const sendTxBtnRef = useRef();\n\n const sendTransaction = async () => {\n if (!toAddress || !amount) return;\n disableForm()\n const receipt = await web3.eth.sendTransaction({\n from: publicAddress,\n to: toAddress,\n value: web3.utils.toWei(amount)\n });\n setTxnHash(receipt.transactionHash);\n enableForm()\n }\n\n // Disable input form while the transaction is being confirmed\n const disableForm = () => {\n setTxnHash();\n setDisabled(true);\n sendTxBtnRef.current.innerText = 'Submitted...';\n }\n\n // Re-enable input form once the transaction is confirmed\n const enableForm = () => {\n setDisabled(false);\n setToAddress('');\n setAmount('');\n fetchBalance(publicAddress);\n sendTxBtnRef.current.innerText = 'Send Transaction';\n }\n\n\n return (\n
\n

Send Transaction

\n setToAddress(e.target.value)} className=\"full-width\" placeholder=\"To Address\" />\n setAmount(e.target.value)} className=\"full-width\" placeholder=\"Amount\" />\n \n {\n txnHash &&\n
\n \n View Transaction\n ↗️\n
\n }\n
\n )\n}","import React, { useCallback } from \"react\";\nimport { useHistory } from \"react-router\";\n\nexport default function Info({ user, magic, handleChangeNetwork, balance }) {\n const history = useHistory();\n\n const logout = useCallback(() => {\n magic.user.logout().then(() => {\n history.push(\"/login\");\n })\n }, [history]);\n\n return (\n <>\n
\n

Current user: {user.email}

\n \n
\n\n
\n

Network

\n
\n \n
\n

Public Address

\n
{user.publicAddress}
\n

Balance

\n
{balance.toString().substring(0, 6)} {magic.network === 'matic' ? 'MATIC' : 'ETH'}
\n
Get Test ETH
\n
Get MATIC
\n
\n \n )\n}","export const abi = [\n\t{\n\t\t\"inputs\": [],\n\t\t\"name\": \"message\",\n\t\t\"outputs\": [\n\t\t\t{\n\t\t\t\t\"internalType\": \"string\",\n\t\t\t\t\"name\": \"\",\n\t\t\t\t\"type\": \"string\"\n\t\t\t}\n\t\t],\n\t\t\"stateMutability\": \"view\",\n\t\t\"type\": \"function\"\n\t},\n\t{\n\t\t\"inputs\": [\n\t\t\t{\n\t\t\t\t\"internalType\": \"string\",\n\t\t\t\t\"name\": \"newMessage\",\n\t\t\t\t\"type\": \"string\"\n\t\t\t}\n\t\t],\n\t\t\"name\": \"update\",\n\t\t\"outputs\": [],\n\t\t\"stateMutability\": \"nonpayable\",\n\t\t\"type\": \"function\"\n\t}\n]","import React, { useEffect, useState } from \"react\";\nimport { useHistory } from \"react-router\";\nimport { magicEthereum, magicMatic, ethWeb3, maticWeb3 } from \"../magic\";\nimport Loading from \"./Loading\";\nimport ContractCall from \"./ContractCall\";\nimport SendTransaction from './SendTransaction';\nimport Info from \"./Info\";\nimport { abi } from '../contract/abi.js';\n\nexport default function Home() {\n const [magic, setMagic] = useState(magicEthereum);\n const web3 = magic.network === \"ethereum\" ? ethWeb3 : maticWeb3;\n const [userMetadata, setUserMetadata] = useState();\n const [balance, setBalance] = useState('...');\n const network = magic.network === \"ethereum\" ? 'ethereum' : 'matic';\n const ropstenContractAddress = '0x3EA3913A352cDd49889c7b0dEc8Dd9491d063453';\n const maticContractAddress = '0xfD827cC6d5b959287D7e1680dBA587ffE5dFcbB4';\n const contract = new web3.eth.Contract(abi, network === \"ethereum\" ? ropstenContractAddress : maticContractAddress);\n const [message, setMessage] = useState('...');\n const history = useHistory();\n\n useEffect(() => {\n // On mount, we check if a user is logged in.\n // If so, we'll retrieve the authenticated user's profile, balance and contract message.\n magic.user.isLoggedIn().then(magicIsLoggedIn => {\n if (magicIsLoggedIn) {\n magic.user.getMetadata().then(user => {\n setUserMetadata(user);\n fetchBalance(user.publicAddress);\n fetchContractMessage();\n });\n } else {\n // If no user is logged in, redirect to `/login`\n history.push(\"/login\");\n }\n });\n }, [magic]);\n\n const handleChangeNetwork = (e) => {\n e.target.value === 'ethereum' ? setMagic(magicEthereum) : setMagic(magicMatic);\n fetchBalance(userMetadata.publicAddress);\n fetchContractMessage();\n }\n\n const fetchBalance = (address) => {\n web3.eth.getBalance(address).then(bal => setBalance(web3.utils.fromWei(bal)))\n }\n\n const fetchContractMessage = () => contract.methods.message().call().then(setMessage)\n\n return (\n userMetadata ? (\n <>\n \n \n \n \n ) : \n );\n}\n\n","import React from \"react\";\nimport { Route, Switch } from \"react-router\";\nimport { BrowserRouter } from \"react-router-dom\";\n\n// Views\nimport Login from \"./Login\";\nimport Callback from \"./Callback\";\nimport Home from \"./Home\";\n\nexport default function App() {\n return (\n \n
\n \n \n \n \n \n
\n
\n );\n}\n\n","import React from \"react\";\nimport { render } from \"react-dom\";\nimport App from \"./components/App\";\n\nimport \"./styles.css\";\n\nrender(, document.getElementById(\"root\"));\n"],"sourceRoot":""}