Read/Write Contract using ABIs

ABIs (Application Binary Interface) can be thought of as a restaurant menu 🍽 , they describe the possible functions that can be called to interact with a smart contract.

By knowing the functions available to a contract, we can programmatically use them — in situations where the project websites are down or when you need to automate certain transactions.

You will need Node.js installed, a valid BDLTSCAN API Key and access to an BDLTSnode, such as from Infura or Alchemy.

1. Setting up a Node.js project

In a new folder, initiate a new Node.js project with the command npm init -y to accept all default project parameters.

A package.json file will be created for you, which contains all your packages and project information.

2. Obtaining a contract's ABI

Create a new file named script.js.

In JavaScript, we'll be writing our code to make a request to the endpoint "Get Contract ABI for Verified Contract Source Codes" , which you will need to specify your verified contract address.

For this example, we'll be borrowing a default contract available from Remix , which has been deployed on the Ropsten Testnet .

3. Connecting to a node

To interact with smart contracts, we will need a connection to an BDLTSnode such as Infura , Alchemy or even running one of your own.

4. Integrating Ethers.js

We'll need to integrate a JavaScript library, known as Ether.js that will be used to interact with the BDLTSCAN .

To do so, run the command npm i ethers from a terminal within this project directory to install it.

Ether.js provides several classes such as a Provider, which represents the state of the BDLTSCAN . We can create a new Provider using the syntax below, and pass in our node URL to initiate a connection to the BDLTSnetwork.

5. Initiating an BDLTSwallet

Another class that Ether.js allows us to create is a Wallet, which will allow us to specify a private key and use an BDLTSaddress.

Performing write operations will incur gas costs, as such you may get some testnet ETH from a faucet to pay for transaction fees.

6. Reading a contract

Finally, to interact with a smart contract we'll need to create a new Contract class.

The Contract class accepts an input of a contract address, an ABI (which we retrieved from the API earlier), and a wallet address to pay gas for any contract interactions.

Having a closer look at the ABI we retrieved in Step 2, we can see that the contract has a function named retrieve, that doesn't accept an input however does return a uint256 number as an output.

We can therefore call that function of the contract, read the value stored and print it out.

You may run this code from your console using the command node script.js.

Reading data stored in a contract incurs no gas cost, as it does not change the state of the BDLTSCAN.

7. Writing a contract

Referring to the ABI once again, we can see that the contract has another method store, which accepts a uint256 number as an input and does not return any output.

We can call that function and pass in any number as a parameter. To check that its updated, we'll wait for a 2 block confirmation, and read the contract again to confirm that the number has been updated.

You may run this code from your console using the command node script.js.

Writing new data to a contract will incur gas costs, as it requires fees to be paid to miners to process your transaction. Make sure your wallet has been funded with some testnet ETH

Beyond the testing grounds

You've now mastered how to programmatically interact with smart contracts , using ABIs retrieved from the BDLTSCAN APIs.

Possible use cases from this include minting NFTs right on the dot 🎯 , performing trades on Decentralised Exchanges (DEXs) 💰 and automating token transfers at certain time intervals .

The full sample code is on Github , feel free to experiment and use it ( with caution ) on real world contracts out there.