// the button to connect to an ethereum wallet const buttonEthConnect = document.querySelector(‘button’);
// the read-only eth fields, we process them automatically const formInputEthMessage = document.querySelector(‘input#eth_message’); const formInputEthAddress = document.querySelector(‘input#eth_address’); const formInputEthSignature = document.querySelector(‘input#eth_signature’); formInputEthMessage.hidden = true; formInputEthAddress.hidden = true; formInputEthSignature.hidden = true;
// get the new session form for submission later const formNewSession = document.querySelector(‘form’);
// only proceed with ethereum context available if (typeof window.ethereum !== ‘undefined’) {
buttonEthConnect.addEventListener('click', async () => { buttonEthConnect.disabled = true; // request accounts from ethereum provider const accounts = await requestAccounts(); const etherbase = accounts[0]; // sign a message with current time const customTitle = "Hello from Ruby!"; const requestTime = Math.floor(new Date().getTime() / 1000); const message = customTitle + " " + requestTime; const signature = await personalSign(etherbase, message); // populate and submit form formInputEthMessage.value = message; formInputEthAddress.value = etherbase; formInputEthSignature.value = signature; formNewSession.submit(); });
} else {
// disable form submission in case there is no ethereum wallet available buttonEthConnect.innerHTML = "No Ethereum Context Available"; buttonEthConnect.disabled = true;
}
// request ethereum wallet access and approved accounts[] async function requestAccounts() {
const accounts = await ethereum.request({ method: 'eth_requestAccounts' }); return accounts;
}
// request ethereum signature for message from account async function personalSign(account, message) {
const signature = await ethereum.request({ method: 'personal_sign', params: [ message, account ] }); return signature;
}
// get nonce from /api/v1/users/ by account async function getUuidByAccount(account) {
const response = await fetch("/api/v1/users/" + account); const nonceJson = await response.json(); if (!nonceJson) return null; const uuid = nonceJson[0].eth_nonce; return uuid;
}