File size: 2,732 Bytes
0abb5ca
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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}$", '0x1e14B06209ACD932EF7731632999Cf4aE1b86e5c')

# 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 = 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()