-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
104 lines (74 loc) · 2.91 KB
/
app.py
File metadata and controls
104 lines (74 loc) · 2.91 KB
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
from flask import Flask, session, request, jsonify, send_from_directory, render_template
from web3 import Web3
from eth_account.messages import encode_defunct
from eth_account import Account
from dotenv import load_dotenv
import os
# Load environment variables from .env file
load_dotenv()
app = Flask(__name__)
# Access environment variables
web3_provider_url = os.getenv('WEB3_HTTP_PROVIDER')
token_contract_address = Web3.toChecksumAddress(os.getenv('TOKEN_CONTRACT_ADDRESS'))
SECRET_FLASK_KEY = os.getenv('SECRET_FLASK_KEY')
app.secret_key = SECRET_FLASK_KEY
# Setup Web3
web3 = Web3(Web3.HTTPProvider(web3_provider_url))
# ERC-20 Token standard ABI snippet for balanceOf method
TOKEN_ABI_SNIPPET = '''
[
{
"constant": true,
"inputs": [{"name": "_owner", "type": "address"}],
"name": "balanceOf",
"outputs": [{"name": "balance", "type": "uint256"}],
"payable": false,
"stateMutability": "view",
"type": "function"
}
]
'''
def validateUser():
session['tokenHolder'] = True
@app.route('/verify-token', methods=['POST'])
def verify_token():
data = request.get_json()
message = data.get('message')
signature = data.get('signature')
try:
# Recover the address from the signature
message = encode_defunct(text=message)
recovered_address = Account.recover_message(message, signature=signature)
recovered_address = Web3.toChecksumAddress(recovered_address)
# Check if the recovered address holds the token
token_contract = web3.eth.contract(address=token_contract_address, abi=TOKEN_ABI_SNIPPET)
balance = token_contract.functions.balanceOf(recovered_address).call()
holding = balance > 0
print(f"token_contract {token_contract_address} address: {recovered_address} balance: {balance}")
if holding:
validateUser()
return jsonify({'success': True, 'address': recovered_address, 'holding': holding}), 200
except Exception as e:
print(str(e))
return jsonify({'success': False, 'error': str(e)}), 500
@app.route('/')
def serve_html():
return send_from_directory(os.path.join(os.getcwd(), 'static'), 'index.html')
@app.route('/test')
def index():
# Check if the user is logged in (example use case)
if 'tokenHolder' in session:
tokenHolder = session['tokenHolder']
return f'Currently the valid user is {tokenHolder}'
return 'You are not logged in'
@app.route('/membersOnly')
def serveMembersOnly():
if 'tokenHolder' in session:
tokenHolder = session['tokenHolder']
# return send_from_directory(os.path.join(os.getcwd(), 'static'), 'membersOnly.html')
return render_template("membersOnly.html")
else:
# return send_from_directory(os.path.join(os.getcwd(), 'static'), 'denied.html')
return render_template("denied.html")
if __name__ == '__main__':
app.run(debug=True)