Building a Decentralized Application with Ethers.js

A Developer's Journey


Building a decentralized application (dApp) can be challenging, but it can be achieved with the right tools and understanding. Ethers.js is a JavaScript library for interacting with the Ethereum blockchain, which provides a robust set of tools for building dApps. In this article, we will take a developer's journey on building a dApp using Ethers.js, highlighting the difficulties and lessons learnt along the way.

  1. Connecting to a web3 provider

    When building a dApp, one of the first steps is to connect to a web3 provider, such as MetaMask or Trust Wallet. This allows the dApp to interact with the Ethereum blockchain. The following code snippet shows how to check if a user is already connected to a web3 provider, and if not, trigger a new connection:

    let provider;

    if (typeof window.ethereum !== 'undefined') {

    provider = new ethers.providers.Web3Provider(window.ethereum);

    try { await window.ethereum.enable();

    } catch (error) {



    } else {

    console.error('No web3 provider found. Please install MetaMask or Trust Wallet');


  2. Listening for network changes

    It's important to keep track of the network that the user is connected to, in case the user switches to a different network. The following code snippet shows how to listen for network changes using Ethers.js:

    provider.on('networkChanged', (network) => {

    console.log(Network changed to: ${



  3. Sending transactions

    Sending transactions is a crucial aspect of building a dApp. The following code snippet shows an example of how to send a safeTransferFrom transaction to a smart contract:

    const contract = new ethers.Contract(contractAddress, abi, signer);

    const data = "0x";

    const tx = await contract.functions.safeTransferFrom(from, to, tokenId, data)

  4. Handling errors

    In the process of building a dApp, errors are bound to occur. It's important to handle these errors properly. One of the errors I encountered was the code: -32000 message: "execution reverted", which indicated that the smart contract function was not able to execute correctly due to one of the conditions not being met.

Conclusion: Building a dApp with Ethers.js can be a challenging task, but with the right tools and understanding, it can be achieved. It's important to have a good understanding of the smart contract functions and their expected parameters, as well as proper error handling. Additionally, understanding the web3 provider and its connection status to the network is crucial. With this knowledge, developers can create powerful decentralized applications on the Ethereum blockchain.