From 19738fccc529274a102cc19871a0bdbc9c239e0d Mon Sep 17 00:00:00 2001 From: lza_menace Date: Fri, 31 Dec 2021 02:14:18 -0800 Subject: [PATCH] getting some chain syncing going, still very rough --- .gitignore | 3 -- suchwowx/cli/cli.py | 51 +++++++++++++++++++++ suchwowx/config.py | 1 + suchwowx/factory.py | 2 +- suchwowx/helpers.py | 13 ++++++ suchwowx/routes/meme.py | 10 +--- suchwowx/static/css/custom.css | 5 ++ suchwowx/static/img/logo.png | Bin 0 -> 15750 bytes suchwowx/templates/includes/meme_card.html | 6 ++- suchwowx/templates/meme.html | 40 ++++++++++++---- 10 files changed, 109 insertions(+), 22 deletions(-) create mode 100644 suchwowx/static/img/logo.png diff --git a/.gitignore b/.gitignore index 2e1118c..b04b154 100644 --- a/.gitignore +++ b/.gitignore @@ -132,9 +132,6 @@ dmypy.json data/ go-ipfs/ avalanchego-v1.7.3 -*jpg -*png -*svg *mp4 *webp *mkv diff --git a/suchwowx/cli/cli.py b/suchwowx/cli/cli.py index 7f8fdc1..bb6c005 100644 --- a/suchwowx/cli/cli.py +++ b/suchwowx/cli/cli.py @@ -1,6 +1,11 @@ +import requests from flask import Blueprint +from secrets import token_urlsafe from suchwowx.factory import db +from suchwowx.helpers import get_eth_contract +from suchwowx.models import Meme, User +from suchwowx import config bp = Blueprint('cli', 'cli', cli_group=None) @@ -9,3 +14,49 @@ bp = Blueprint('cli', 'cli', cli_group=None) @bp.cli.command('init') def init(): db.create_all() + +@bp.cli.command('sync-avax') +def sync_avax(): + """ + Synchronize your local database with the tokens minted on Avalanche blockchain. + """ + contract = get_eth_contract() + total_supply = contract.functions.totalSupply().call() + # walk backwards through all tokens at top of supply + # until you've accounted for the last known + for i in range(total_supply, 0, -1): + # first get metadata ipfs hash + deets = contract.functions.tokenMeme(i).call() + try: + meme_exists = Meme.query.filter(Meme.meta_ipfs_hash == deets[5]).first() # noqa + user_exists = User.query.filter(User.public_address == deets[4].lower()).first() # noqa + if meme_exists: + if not meme_exists.minted: + meme_exists.minted = True + db.session.commit() + print(f'[+] Marked existing meme {meme_exists.id} as minted') + else: + print(deets) + if not user_exists: + user_exists = User( + public_address=deets[4].lower() + ) + db.session.add(user_exists) + db.session.commit() + user_exists.handle = f'anon{user_exists.id}-{token_urlsafe(6)}' + db.session.commit() + print(f'[+] Created user {user_exists.handle}') + res = requests.get(f'{config.IPFS_SERVER}/ipfs/{deets[5]}', timeout=30).json() + meme = Meme( + title=res['name'], + description=res['description'], + user_id=user_exists.id, + meta_ipfs_hash=deets[5], + meme_ipfs_hash=res['image'].split('ipfs://')[1], + minted=True + ) + db.session.add(meme) + db.session.commit() + print(f'[+] Added new meme {meme.id}') + except Exception as e: + print(e) diff --git a/suchwowx/config.py b/suchwowx/config.py index 412379f..8468944 100644 --- a/suchwowx/config.py +++ b/suchwowx/config.py @@ -8,6 +8,7 @@ SECRET_KEY = getenv('SECRET_KEY', 'yyyyyyyyyyyyy') DATA_FOLDER = getenv('DATA_FOLDER', '/path/to/uploads') SERVER_NAME = getenv('SERVER_NAME', '127.0.0.1:5000') IPFS_SERVER = getenv('IPFS_SERVER', 'http://127.0.0.1:8080') +AVAX_RPC = getenv('AVAX_RPC', 'https://api.avax-test.network/ext/bc/C/rpc') # Cache CACHE_HOST = getenv('CACHE_HOST', 'localhost') diff --git a/suchwowx/factory.py b/suchwowx/factory.py index 49bf5f3..21f875b 100644 --- a/suchwowx/factory.py +++ b/suchwowx/factory.py @@ -10,7 +10,7 @@ from suchwowx import config db = SQLAlchemy() -w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:9650')) # noqa +w3 = Web3(Web3.HTTPProvider(config.AVAX_RPC)) def setup_db(app: Flask, db: SQLAlchemy = db): diff --git a/suchwowx/helpers.py b/suchwowx/helpers.py index a3974d6..8b268dc 100644 --- a/suchwowx/helpers.py +++ b/suchwowx/helpers.py @@ -6,6 +6,19 @@ from suchwowx.factory import w3 from suchwowx import config +def get_eth_contract(): + """ + Return a web3 contract object with the currently + deployed SuchWowX smart contract. + """ + contract_abi = config.CONTRACT_ABI + contract_address = w3.toChecksumAddress(config.CONTRACT_ADDRESS) + return w3.eth.contract( + address=contract_address, + abi=contract_abi + ) + + def verify_signature(message, signature, public_address): msg = encode_defunct(text=message) recovered = w3.eth.account.recover_message(msg, signature=signature) diff --git a/suchwowx/routes/meme.py b/suchwowx/routes/meme.py index aa81f10..3d0fcaf 100644 --- a/suchwowx/routes/meme.py +++ b/suchwowx/routes/meme.py @@ -21,15 +21,7 @@ def index(): memes = Meme.query.filter( Meme.approved == True ).order_by(Meme.create_date.desc()) - w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:9650')) - contract_address = w3.toChecksumAddress(config.CONTRACT_ADDRESS) - contract_abi = config.CONTRACT_ABI - contract = w3.eth.contract( - address=contract_address, - abi=contract_abi - ) - # total_supply = contract.functions.totalSupply().call() - return render_template('index.html', memes=memes, contract=contract) + return render_template('index.html', memes=memes) @bp.route('/mod') diff --git a/suchwowx/static/css/custom.css b/suchwowx/static/css/custom.css index afdf0e6..f172702 100644 --- a/suchwowx/static/css/custom.css +++ b/suchwowx/static/css/custom.css @@ -27,3 +27,8 @@ .wrap { word-wrap: break-word; } + +.mintedAVAX { + background-color: rgba(242,37,52,.2); + border: 2px solid rgba(243,37,52,1); +} diff --git a/suchwowx/static/img/logo.png b/suchwowx/static/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..08951f9a989e3a52b3256f7cbbdfba12e04c7544 GIT binary patch literal 15750 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 literal 0 HcmV?d00001 diff --git a/suchwowx/templates/includes/meme_card.html b/suchwowx/templates/includes/meme_card.html index f51346a..15ce290 100644 --- a/suchwowx/templates/includes/meme_card.html +++ b/suchwowx/templates/includes/meme_card.html @@ -1,8 +1,9 @@ {# expects meme var #} -
+
diff --git a/suchwowx/templates/meme.html b/suchwowx/templates/meme.html index f572bb2..522a1d3 100644 --- a/suchwowx/templates/meme.html +++ b/suchwowx/templates/meme.html @@ -19,6 +19,7 @@
+ {% if meme.file_name %} {% if meme.file_name.endswith('mp4') %}
{% if not meme.approved %} @@ -63,19 +70,19 @@ {% else %}