Read Blockchainweb3

Source

READ DATA

Read data from blockchain.

using ethersjs + javascript


Review

  • Frontend
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.ethers.io/lib/ethers-5.2.umd.min.js" type="application/javascript"></script>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
  
</head>
<body>
    
    <header class="container-fluid text-center">
        <h1 class="display-1">ETHERS JS</h1> <span class="text-secondary">EXAMPLE</span>
        <hr>
    </header>

    <main class="container my-5 text-center">
        <button id="connect" class="btn btn-outline-primary">Connect</button>
        <b id="add" class="lead">0x0...0</b>
    </main>
    
    <div class="row p-5 mx-5 rounded shadow-lg text-center" style="border: 1px dashed #bababa;background:#dddddd;">
        <div class="col">
            <button id="balances" class="btn btn-outline-danger">Balance</button>
            <b id="balance" class=" bg-secondary rounded text-light m-3 px-3 py-1">ETH</b>
            <span class="badge text-secondary bg-warning shadow-lg p-2">need to connect</span>
        </div>
        
        <div class="col">
            <button id="chain" class="btn btn-outline-secondary">Chain Id</button>
            <b id="chainId" class=" bg-secondary rounded text-light m-3 px-3 py-1">?</b>
            <span class="badge text-secondary bg-warning shadow-lg p-2">need to connect</span>
        </div>
    </div>

    <div class="container my-5">
        <button id="cods" class="btn btn-primary">check block</button>
        <b class="p-2 badge text-secondary bg-warning m-3">after click button, wait for transaction (or open console). no-need to connect.</b>
        <section id="codeSection" class="bg-dark text-light p-3 mt-3 rounded shadow-lg">click (check block) button</section>
    </div>

    <footer class="container-fluid text-center py-2">
        <hr>
        2023 Ethersjs example - github @mosi-sol
    </footer>

    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js" integrity="sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN" crossorigin="anonymous"></script>
    <script src="./app.js"></script>
</body>
</html>
  • Backend
const initialize = () => {

    if (typeof window.ethereum !== 'undefined') {
        console.log('MetaMask is installed!'); // dev
    } 

    window.onload = async function() {
        this.ethereum.on('accountsChanged', accountChange);
        // ethereum.removeListener('accountsChanged', accountChange);
        afterOnLoad();
    }    

    const add = document.getElementById('add');
    async function afterOnLoad() {
        const provider = new ethers.providers.Web3Provider(window.ethereum); // (window.ethereum, DEFAULT_CHAIN)
        const accounts = await provider.listAccounts();
        accounts[0] != undefined ? 
        handleAccountsChanged(accounts[0]) : // window.ethereum.selectedAddress
        add.innerHTML = "0x0...0";
        accounts[0] != undefined ? 
        handleAccountsChanged(accounts[0]) : 
        conn.innerHTML = "Connect"; 
    }

    const conn = document.getElementById('connect');
    conn.addEventListener('click', () => {
        connection();
    });

    async function connection() {
        window.ethereum.request({ 
            method: 'eth_accounts' 
        }).then(getAccount).catch((err) => {
                console.log(err);
            });
        const provider = new ethers.providers.Web3Provider(window.ethereum); // (window.ethereum, DEFAULT_CHAIN)

        const accounts = await provider.listAccounts();
        console.log(accounts[0]); // dev
        // ---
        // const signer = await provider.getSigner(); 
    }

    async function getAccount() {
        const accounts = await ethereum.request({ 
            method: 'eth_requestAccounts' }).catch((err) => {
                console.log(err.code);
            });
        // ---
        const account = accounts[0];
        handleAccountsChanged(account);
    }

    const accountChange = (a) => {
        accounts = a;
        handleAccountsChanged(a);
    }

    function handleAccountsChanged(accounts) {
        conn.innerHTML = "Connected";
        // add.innerHTML = accounts.slice(2,5);
        // add.innerHTML = accounts.substr(2,5);
        add.innerHTML = accounts;
    }

    // == connection end == \\
    // == code start below == \\
    

}
window.addEventListener('DOMContentLoaded', initialize);

    const codeSection = document.getElementById('codeSection');
    const cods = document.getElementById('cods');
    cods.addEventListener('click', () => {
        showBalance();
    });

// const showBalance = async () => {
    async function showBalance() {
        const INFURA_ID = 'your infura key here' // dont reveal this line, use [.env]
        const provider = new ethers.providers.JsonRpcProvider(`https://mainnet.infura.io/v3/${INFURA_ID}`)
        
        codeSection.innerHTML = "click (check block) button - please wait";

        console.log("1===========\n");
        const block = await provider.getBlockNumber();
        console.log(`\nBlock Number: ${block}\n`);

        console.log("2===========\n");
        const blockInfo = await provider.getBlock(block);
        console.log(blockInfo);

        console.log("3===========\n");
        const { transactions } = await provider.getBlockWithTransactions(block);

        console.log("4===========\n");
        console.log(`\nLogging first transaction in block:\n`);
        console.log(transactions[0]);

        codeSection.innerHTML = `<p>
        <span class="text-secondary">Block Number:</span> ${block}
        <hr>
        <span class="text-secondary">the.chainId:</span><b class="text-warning"> ${transactions[0].chainId} </b><br />
        <span class="text-secondary">blockInfo.hash:</span> ${blockInfo.hash} <br />
        <span class="text-secondary">blockInfo.time:</span> ${blockInfo.timestamp} <br />
        <span class="text-secondary">blockInfo.parent-hash:</span> ${blockInfo.parentHash} <br />
        <span class="text-secondary">blockInfo.miner:</span> ${blockInfo.miner} <br />
        <hr>
        <span class="text-secondary">Logging first transaction[0] in block (hash):</span><br />
        ${transactions[0].hash}<br />
        <br />
        <span class="text-secondary">transaction.gasPrice:</span><span class="badge text-wrap"> ${transactions[0].gasPrice._hex} </span><br />
        <span class="text-secondary">transaction.from:</span> ${transactions[0].from} <br />
        <span class="text-secondary">transaction.to:</span> ${transactions[0].to} <br />
        <hr>
        <span class="text-secondary">Logging second transaction[1] in block (hash):</span><br />
        ${transactions[1].hash}<br />
        <br />
        <span class="text-secondary">transaction.gasPrice:</span><span class="badge text-wrap"> ${transactions[1].gasPrice._hex} </span><br />
        <span class="text-secondary">transaction.from:</span> ${transactions[1].from} <br />
        <span class="text-secondary">transaction.to:</span> ${transactions[1].to} <br />
        </p>`;
    }

    const balVal = document.getElementById('balance');
    const bal = document.getElementById('balances');
    bal.addEventListener('click', () => {
        getBalance();
    });
    async function getBalance() {
        const provider = new ethers.providers.Web3Provider(window.ethereum);
        const address = window.ethereum.selectedAddress;
        const balance = await provider.getBalance(address);
        console.log(`The ${address} balance: ${ethers.utils.formatEther(balance)}`);
        balVal.innerHTML = `${ethers.utils.formatEther(balance)} ETH`;
    }

    const chainVal = document.getElementById('chainId');
    const chain = document.getElementById('chain');
    chain.addEventListener('click', async () => {
        const provider = new ethers.providers.Web3Provider(window.ethereum);
        const network = await provider.getNetwork();
        const chainId = network.chainId;
        console.log(chainId);
        chainVal.innerHTML = chainId;
    });