import { Payload as SIWPayload, SIWWeb3 } from '@web3auth/sign-in-with-web3'; import React, { useState } from 'react'; import Swal from 'sweetalert2'; import Web3 from 'web3'; import styles from '../public/css/ethereum.module.css'; import EthereumLogo from '../public/ethereum-logo.png'; declare global { interface Window { ethereum: any; web3: any; } } const Ethereum: React.FC = () => { const [siwwMessage, setSiwwMessage] = useState(); const [sign, setSignature] = useState(""); const [publicKey, setPublicKey] = useState(""); const [currentProvider, setProvider] = useState(); // Domain and origin const domain = window.location.host; const origin = window.location.origin; let statement = "Sign in with Ethereum to the app."; const detectCurrentProvider = () => { let provider; if (window.ethereum) { provider = window.ethereum; } else if (window.web3) { provider = window.web3.currentProvider; } else { console.log( 'Non-Ethereum browser detected. You should consider trying MetaMask!' ); } return provider; }; async function connectWallet() { try { setProvider(detectCurrentProvider()); if (currentProvider) { if (currentProvider !== window.ethereum) { Swal.fire( 'Non-Ethereum browser detected. You should consider trying MetaMask!' ); } await currentProvider.request({ method: 'eth_requestAccounts' }); const web3 = new Web3(currentProvider); const userAccount = await web3.eth.getAccounts(); if (userAccount.length === 0) { console.log('Please connect to meta mask'); } else { setPublicKey(userAccount[0]) } } } catch (err) { console.log( 'There was an error fetching your accounts. Make sure your Ethereum client is configured correctly.' ); } } // Generate a message for signing // The nonce is generated on the server side function createEthereumMessage() { const payload = new SIWPayload(); payload.domain = domain; payload.address = publicKey; payload.uri = origin; payload.statement = statement; payload.version = "1"; payload.chainId = 1; const header = { t : "eip191" }; const network = "ethereum" let message = new SIWWeb3({ header, payload ,network}); setSiwwMessage(message); const messageText = message.prepareMessage(); const web3 = new Web3(currentProvider); web3.eth.personal.sign(messageText, publicKey, "", (err, result) => { if (err) { console.log(err); } else { setSignature(result); } }); } return ( <> {publicKey!="" && sign == "" &&

Sign Transaction

} { publicKey == "" && sign=="" &&

Sign in With Ethereum

} { sign && <>

Verify Signature

setSignature(e.target.value)} /> } ); }; export default Ethereum;