How to read data from smart contracts using web3.js (2024)

Get the Learn to Code Starter Pack

Break into tech with the logic & computer science skills you’d learn in a bootcamp or university — at a fraction of the cost. Educative's hand-on curriculum is perfect for new learners hoping to launch a career.

Web3.js is an open source library of javascript built by the Ethereum foundation to allow end users to interact with an Ethereum node using HTTP, IPC, or WebSocket.

How to read data from smart contracts

The web3.js library provides an eth package to interact with smart contracts. The eth package further contains a contract object with the functions required to interact with a smart deployed on the Ethereum network.

The functions need some arguments to interact with the required smart contracts successfully. The required arguments are the smart contract’s application binary interface (ABI) and address.

ABI

ABI is an interface between the front end and the back end of a Dapp. ABI contains information about the functions present in the smart contact along with their parameters and return type.

ABI of a smart contract can be taken from Etherscan.io by following the steps given below:

  1. Go to Etherscan.io and click “ERC20 Top Tokens” in the drop-down of “Tokens” located in the top navigation bar.

  2. Click any token from the list of ERC20 tokens.

  3. Now, the details of that token will be shown. Click the “Contract” tab to see the contract details.

  4. Then scroll down a little, and the contract ABI will be visible there. We'll use it as a parameter when selecting the smart contract.

Address

Every account and smart contract in the Ethereum blockchain has an address. We need the address to locate the smart contract and interact with it.

The smart contract address can be fetched from the same page where we get the ABI. We just have to scroll up and see “Contract” written under the “Profile summary.” The smart contract address is written in front of the contract.

Note: We also need to establish a connection to the Ethereum node. For that, we use Infura API.

Code example without parameters

In the code example given below, we'll read the name, symbol, and total supply from the smart contract of the Tether USD token.

const Web3 = require('web3')const jsonRpcURL = 'https://mainnet.infura.io/v3/917c4f75f17a4e28b78263cddd8f1b46' const web3 = new Web3(jsonRpcURL)const abi = [{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_upgradedAddress","type":"address"}],"name":"deprecate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"deprecated","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_evilUser","type":"address"}],"name":"addBlackList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgradedAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maximumFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_maker","type":"address"}],"name":"getBlackListStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newBasisPoints","type":"uint256"},{"name":"newMaxFee","type":"uint256"}],"name":"setParams","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"issue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"redeem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"basisPointsRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isBlackListed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_clearedUser","type":"address"}],"name":"removeBlackList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MAX_UINT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_blackListedUser","type":"address"}],"name":"destroyBlackFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_initialSupply","type":"uint256"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_decimals","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"Issue","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAddress","type":"address"}],"name":"Deprecate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"feeBasisPoints","type":"uint256"},{"indexed":false,"name":"maxFee","type":"uint256"}],"name":"Params","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_blackListedUser","type":"address"},{"indexed":false,"name":"_balance","type":"uint256"}],"name":"DestroyedBlackFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_user","type":"address"}],"name":"AddedBlackList","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_user","type":"address"}],"name":"RemovedBlackList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"}]const contractAddress = '0xdAC17F958D2ee523a2206206994597C13D831ec7'const contract = new web3.eth.Contract(abi, contractAddress)/* This will not execute the function instead it will return the function as it is. Try to un comment line 16 and see the output.*///console.log(contract.methods.name())/* This will execute the function and return a promise as it is an asynchronous function. Try to un comment line 24 and see the output.*///console.log(contract.methods.name().call())async function readFromSmartContract(){ tokenName = await contract.methods.name().call() console.log("Name: ", tokenName) tokenSymbol = await contract.methods.symbol().call() console.log("Symbol: ", tokenSymbol) tokenTotalSupply = await contract.methods.totalSupply().call() console.log("Total supply: ", tokenTotalSupply)}readFromSmartContract() // Function call to fetch the information

Code explanation

The explanation of the code above is as follows:

  • Line 8: We declare contract and initialize with the smart contract specified using the abi and the contractAddress.

    • Line 28: We fetch the name of the token using name() and call(), as name() returns the function itself. And call() helps execute that function. Furthermore, we use await because call() is asynchronous and returns a promise. So to get the actual answer, the await stops the execution of the function until call() returns.

  • Line 31: We fetch the token’s symbol using symbol() and call(). The await keyword is used as call() (an asynchronous function).

  • Line 34: We fetch the token’s total supply using totalSupply() and call(). The await keyword is used as call() (an asynchronous function).

Code example with parameters

In the code example below, we'll read the balance of an account holding the Tether USD token.

To get the balance, we first need the address of the account that holds the specified token. We can get the address by following the simple steps below. We'll continue from the example above.

  1. Go to the “Holders” tab next to the “Contract” tab.

  2. Click any address from the list.

  3. Copy the address next to “Contract” under “Profile Summary.”

const Web3 = require('web3')const jsonRpcURL = 'https://mainnet.infura.io/v3/917c4f75f17a4e28b78263cddd8f1b46' const web3 = new Web3(jsonRpcURL)const abi = [{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_upgradedAddress","type":"address"}],"name":"deprecate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"deprecated","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_evilUser","type":"address"}],"name":"addBlackList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgradedAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maximumFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_maker","type":"address"}],"name":"getBlackListStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newBasisPoints","type":"uint256"},{"name":"newMaxFee","type":"uint256"}],"name":"setParams","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"issue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"redeem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"basisPointsRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isBlackListed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_clearedUser","type":"address"}],"name":"removeBlackList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MAX_UINT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_blackListedUser","type":"address"}],"name":"destroyBlackFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_initialSupply","type":"uint256"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_decimals","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"Issue","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAddress","type":"address"}],"name":"Deprecate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"feeBasisPoints","type":"uint256"},{"indexed":false,"name":"maxFee","type":"uint256"}],"name":"Params","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_blackListedUser","type":"address"},{"indexed":false,"name":"_balance","type":"uint256"}],"name":"DestroyedBlackFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_user","type":"address"}],"name":"AddedBlackList","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_user","type":"address"}],"name":"RemovedBlackList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"}]const contractAddress = '0xdAC17F958D2ee523a2206206994597C13D831ec7'const address = '0x69166e49d2fd23e4cbea767d7191be423a7733a5'const contract = new web3.eth.Contract(abi, contractAddress)async function readFromSmartContract(){ balanceOfAccount = await contract.methods.balanceOf(address).call() console.log("Balance: ", balanceOfAccount)}readFromSmartContract() // Function call to fetch the information

Code explanation

The explanation of the code above is as follows:

  • Line 13: We fetch the token holder’s account balance using balanceOf() and call(). The balanceOf() is sent an address of the account of the token holder as a parameter. The await keyword is used as call() (an asynchronous function).

RELATED TAGS

web3

ethereum

javascript

CONTRIBUTOR

How to read data from smart contracts using web3.js (1)Muhammad Zubair

Copyright ©2024 Educative, Inc. All rights reserved

How to read data from smart contracts using web3.js (2024)

FAQs

How to read data from a smart contract? ›

ABI
  1. Go to Etherscan.io and click “ERC20 Top Tokens” in the drop-down of “Tokens” located in the top navigation bar.
  2. Click any token from the list of ERC20 tokens.
  3. Now, the details of that token will be shown. ...
  4. Then scroll down a little, and the contract ABI will be visible there.

How does a smart contract work in Ethereum? ›

The smart contract code verifies if the conditions of the sale have been met, such as the receipt of the agreed-upon amount of cryptocurrency. If the conditions are met, the smart contract executes the terms of the agreement automatically. For example, it transfers ownership of the product to the buyer.

What are blockchain smart contracts? ›

A smart contract is defined as a digital agreement that is signed and stored on a blockchain network, which executes automatically when the contract's terms and conditions (T&C) are met. The T&C is written in blockchain-specific programming languages such as Solidity.

How to interact with a smart contract using web3js? ›

Join our Discord server and head to the #web3js-general channel to connect with other developers and get the support you need.
  1. Step 1: Setting up the Environment​ ...
  2. Step 2: Create a new project directory and initialize a new Node. ...
  3. Step 3: Write the Solidity code for the smart contract and save it to a file​

How to fetch data from blockchain? ›

Users can search for specific addresses, transactions, or blocks to retrieve relevant data. Using APIs (Application Programming Interfaces): Blockchain networks often provide APIs that developers can utilize to programmatically access blockchain data.

What is a good example of a smart contract? ›

A smart contract is a self-executing program based on if-then logic. Vending machines provide a good analogy. If someone inserts $2 and presses B4, then the machine dispenses the cookies in the B4 slot. In other words, if the vending machine receives the required item of value, then it performs the requested action.

How to execute smart contracts in blockchain? ›

How smart contracts work with blockchain: A step-by-step guide
  1. Parties agree to terms and conditions.
  2. The smart contract is created.
  3. The smart contract is deployed.
  4. Triggering conditions are met.
  5. The smart contract is executed.
  6. The contract result is recorded to the blockchain.

How much does it cost to run a smart contract? ›

Smart contract creation cost can be anywhere from $10 to $2,000 assuming Ether costs between $1,500 to $2,000. The biggest factors are 1) Ethereum price, 2) the size of the compiled contract (in bytes), 3) the current gas price on the Ethereum network.

What is the token used for executing smart contracts? ›

An ERC20 token is a standard for creating and issuing smart contracts on the Ethereum blockchain. ERC stands for "Ethereum Request for Comment," and the ERC20 standard was implemented in 2015.

Where to code smart contracts? ›

The way smart contract development works under Ethereum is that developers write smart contract code in Solidity as a text file. Then, they use a tool called the Solidity compiler (solc) to transform the Solidity text into bytecode that the EVM can understand.

What are the top 10 smart contracts? ›

The top 10 best smart contract platforms in 2024 are Ethereum, Binance Smart Chain (BSC), TRON, Arbitrum, Cardano, Solana, Polygon, Algorand, Avalanche, and Tezos.

How to make money with smart contracts? ›

The smart contract developer has two main on-chain methods for monetizing their work:
  1. launch a token that is required to use the protocol, have a sale, hold back a significant proportion, and then make profits by selling more as the token price rises.
  2. charge a commission for using the smart contract.
Oct 31, 2023

What is the best blockchain for smart contracts? ›

It is common for public blockchains to support smart contracts and decentralized applications (dApps), enabling complex programmable use cases. Popular public blockchains include Ethereum, Binance Smart Chain (BSC), and Polkadot.

What is the most popular blockchain for smart contracts? ›

Ethereum is the world's first and one of the best smart contract platforms which remains the most popular choice among developers. Following Bitcoin's decentralized concept, Ethereum has become a leader in smart contract platforms. Since its inception in 2015, the platform has launched more than 4,400 dApps.

How to check a smart contract? ›

Verifying a smart contract basically involves the following steps:
  1. Input the source files and compilation settings to a compiler.
  2. Compiler outputs the bytecode of the contract.
  3. Get the bytecode of the deployed contract at a given address.
  4. Compare the deployed bytecode with the recompiled bytecode.
Nov 23, 2023

How to read data from Ethereum blockchain? ›

One way to retrieve data from the Ethereum blockchain is by using web3. js, a JavaScript library for interacting with Ethereum nodes. With web3. js, you can send a request to an Ethereum node and retrieve the data stored in the blockchain.

How to read an NFT contract? ›

How to Read an NFT Smart Contract
  1. Access a Blockchain Explorer: Platforms like Etherscan (for Ethereum) or BscScan (for Binance Smart Chain) are ideal.
  2. Search the Contract Address: Input the contract's address into the explorer's search bar.
  3. Navigate to the 'Code' Tab: This displays the contract's source code.
Sep 27, 2023

How to read Etherscan transactions? ›

How to use Etherscan to view wallets and transaction history
  1. Go to Etherscan.io.
  2. Paste the wallet address (or ENS domain) into the search bar on the homepage.
  3. On the next page, you can see the balance, the tokens held, and the transactions made with that wallet.

Top Articles
Latest Posts
Article information

Author: Van Hayes

Last Updated:

Views: 5934

Rating: 4.6 / 5 (66 voted)

Reviews: 81% of readers found this page helpful

Author information

Name: Van Hayes

Birthday: 1994-06-07

Address: 2004 Kling Rapid, New Destiny, MT 64658-2367

Phone: +512425013758

Job: National Farming Director

Hobby: Reading, Polo, Genealogy, amateur radio, Scouting, Stand-up comedy, Cryptography

Introduction: My name is Van Hayes, I am a thankful, friendly, smiling, calm, powerful, fine, enthusiastic person who loves writing and wants to share my knowledge and understanding with you.