surveydata / app.py
decentralizedsurvey's picture
Update app.py
acd7171
import streamlit as st
import web3
import requests
import pandas
# Connect to the Sepolia Ethereum blockchain
w3 = web3.Web3(web3.HTTPProvider(st.secrets["infura"]))
# Variables
ABI = '[ { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "string", "name": "data", "type": "string" } ], "name": "Store", "type": "event" }, { "inputs": [ { "internalType": "string", "name": "_IPFSHash", "type": "string" } ], "name": "storeHash", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ]'
# Changing the App title
st.set_page_config(page_title="Survey Data Retriever",)
# The following code centralizes all the buttons
st.markdown("<style>.row-widget.stButton {text-align: center;}</style>", unsafe_allow_html=True)
# Title
st.title('Survey Data Retriever')
st.write("# ")
# Text field
contract_address = st.text_input(r"$\textsf{\Large Smart Contract Address}$", '0x42b76d8c32f914630627bf924bd1e06055673cf8')
# Button
button = st.button("Retrieve Survey Responses")
# Button is pressed
if button:
# Starts the progression bar
my_bar = st.progress(0, text= "Operation in progress. Please wait.")
# data frame with the data
df = pandas.DataFrame()
# Getting logs from ETH contract
contract = w3.eth.contract( address = w3.to_checksum_address(contract_address), abi = ABI)
logs = contract.events.Store.get_logs(fromBlock= 4635673)
# Writing a label
st.write(r"$\textsf{\normalsize \textbf{IPFS Hashes}}$")
for i, log in enumerate(logs):
# Adjusting progression bard
my_bar.progress((i+1)/len(logs), text= "Operation in progress. Please wait.")
# Writing the hashes
st.write(f"**Hash**: {log.args.data}; **Block number**: {log.blockNumber}")
# Requesting data from IPFS using INFURA API
params = (('arg', log.args.data),)
response = requests.post('https://ipfs.infura.io:5001/api/v0/cat',
params=params,
auth=(st.secrets["username"], st.secrets["password"]))
# create a row for the values associated with the 'data' key
json_to_row = pandas.json_normalize(response.json())
# append data to empty data frame
df = pandas.concat([df,json_to_row], ignore_index=True)
# Printing df
st.write("# ")
st.write(r" $\textsf{\normalsize \textbf{Response Data}}$")
st.write(df)
# Download button
st.download_button("Press to Download",
df.to_csv(index=False).encode('utf-8'),
"responses.csv",
"text/csv",
key='download-csv')
# Clearing progression bar
my_bar.empty()