How to Interact with Smart Contracts locally using web3.py
Tags: vyper, bnbchain, web3, python
Published: 2024-05-17 20:13:19

Writing smart contracts is one thing but, interacting with them is another.Today we are going to dive into how we can interact with our deployed smart contracts locally using web3.py. I would recommend you to look out for my early post which is a beginner tutorial on [how to write smart contracts using vyper, remix IDE and deploying them on bnb smart chain.](https://dev.to/mosesmuwawu/writing-smart-contracts-using-vyper-remix-ide-and-deploying-them-on-bnb-smart-chain-8o8)

## Step-by-step procedure:
We are going to go through the process in two major steps i.e; 

**a**. Writing and compiling our smart contract on remix and then deploy it on binance smart chain.

**b**. Interacting with the deployed smart contract locally in vs code.

Well, let's start with writing the following smart contract in Remix IDE that must print `Hello, World!`. 
```python
# A simple Vyper contract
@external
def sayHello() -> String[13]:
    return "Hello, World!"

```

I won't go deep into this process as i have already covered this in my [first tutorial.](https://dev.to/mosesmuwawu/writing-smart-contracts-using-vyper-remix-ide-and-deploying-them-on-bnb-smart-chain-8o8). I would recommend you visit it so that we can move at the same pace.

So, after compiling, copy and save the ABI. We shall use this later with in our web3.py code.

Next, deploy the code and copy and save the contract address. This also, is going to be important in our web3.py code as we shall see later.


![Copy contract addres](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8vcss4gdqn5t4b2z1807.jpg)

 

I am going to use vs code for development on wsl2(Ubuntu) on my local machine, and [web3.py](https://web3py.readthedocs.io/en/stable/quickstart.html) for interacting with the smart contracts.

- First, we need to setup our development environment by setting up a development folder and environment.We shall do this by running the following commands in Ubuntu simultaneously as follows
`$ mkdir testing`, `$ cd testing`, `$ python3 -m venv .venv`, and then open vs code using the command; `code .`  

   In vs code, open terminal and activate the virtual environment
   by running `$ source .venv/bin/activate`

- Next, we need to install a very important tool `Ganache`.This development tool allows you to simulate a blockchain environment locally on your machine.Let's run the following commands to install and activate it respectively. 

`$ npm install -g ganache-cli` and `ganache-cli`. 

- Installing web3.py  

This is a Python library for interacting with Ethereum-based blockchains. Let's install by running the following command:          
`$ pip install web3`.

Good. Now, we are ready to go. Next, let's create a folder inside our root folder `testing` and name it `vyper_project`. Then, inside our newly created folder, we create a file named `call_say_hello.py`. This is where we are going to put our python code. 

```python
from web3 import Web3

# Connect to a remote bsc node
web3 = Web3(Web3.HTTPProvider('https://data-seed-prebsc-1-s1.binance.org:8545/'))

# ABI of the compiled Vyper contract
abi = [
	{
		"type": "function",
		"name": "sayHello",
		"stateMutability": "nonpayable",
		"inputs": [],
		"outputs": [
			{
				"name": "",
				"type": "string"
			}
		]
	}
] # Replace this with your contact ABI


# Address of the deployed contract
contract_address = web3.to_checksum_address('0xae95803315d402afb1a24c48e4c3f7d67180747e')  # replace with your contract's address

# Create a contract instance
contract = web3.eth.contract(address=contract_address, abi=abi)

# Call the sayHello function
def call_say_hello():
    try:
        result = contract.functions.sayHello().call()
        print('Contract sayHello() output:', result)
    except Exception as e:
        print('Error calling sayHello():', e)

call_say_hello()

```  

Lastly, we have to run the code.

`$ python3 path/to/your/file` which in this case will be `$ python3 vyper_project/call_say_hello.py`

We should get this out-put:



![Terminal Output](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2ldap2z36ob1ioh67cg5.jpg) 

The out put of `Contract sayHello output: Hello, World!` confirms that we have successfully interacted with our smart contract.  

Congratulations if you have made it up to this stage. Happy building. 
You can also check on my article of how to [interact with smart contracts using python and django.](https://dev.to/mosesmuwawu/how-to-interact-with-smart-contracts-using-python-and-django-4o94)
If you found this article helpful, please leave a heart and interactions are welcome in the comment section.