Skip to content

Commit 3b8c190

Browse files
committed
use hubs in example, expose methods, beta release
1 parent 8dbc476 commit 3b8c190

9 files changed

Lines changed: 40 additions & 29 deletions

File tree

examples/simple/api/index.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import os
55
import time
66
from flask import Flask, url_for, jsonify
7-
from framelib import frame, message, validate_message_or_mock_vercel
7+
from framelib import frame, message, validate_message_or_mock, validate_message_or_mock_neynar
88

99
app = Flask(__name__)
1010

@@ -38,14 +38,18 @@ def second_page():
3838

3939
# validate frame message with neynar
4040
api_key = os.getenv('NEYNAR_KEY')
41-
msg_val = validate_message_or_mock_vercel(msg, api_key)
42-
print(f'validated frame message, fid: {msg_val.interactor.fid}, button: {msg_val.tapped_button}')
41+
msg_neynar = validate_message_or_mock_neynar(msg, api_key, mock=_vercel_local())
42+
print(f'validated frame message, fid: {msg_neynar.interactor.fid}, button: {msg_neynar.tapped_button}')
43+
44+
# validate frame message with hub
45+
msg_hub = validate_message_or_mock(msg, 'https://nemes.farcaster.xyz:2281', mock=_vercel_local())
46+
print(f'validated frame message hub, fid: {msg_hub.data.fid}, button: {msg_hub.data.frameActionBody.buttonIndex}')
4347

4448
return frame(
4549
image=_github_preview_image(),
4650
button1='back \U0001F519',
4751
post_url=url_for('home', _external=True),
48-
input_text=f'hello {msg_val.interactor.username}!',
52+
input_text=f'hello {msg_neynar.interactor.username}!',
4953
button2='github',
5054
button2_action='link',
5155
button2_target='https://github.com/devinaconley/python-frames'
@@ -55,3 +59,8 @@ def second_page():
5559
def _github_preview_image() -> str:
5660
hour = int((time.time() // 3600) * 3600) # github throttles if you invalidate image cache too much
5761
return f'https://opengraph.githubassets.com/{hour}/devinaconley/python-frames'
62+
63+
64+
def _vercel_local() -> bool:
65+
vercel_env = os.getenv('VERCEL_ENV')
66+
return vercel_env is None or vercel_env == 'development'

examples/simple/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# requirements.txt
2-
framelib~=0.0.3
2+
framelib~=0.0.4b3
33
Flask~=3.0.1
44
pydantic

examples/transaction/api/index.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import json
66
from flask import Flask, url_for, jsonify, request
7-
from framelib import frame, message, validate_message_or_mock_vercel, transaction
7+
from framelib import frame, message, transaction
88
from eth_utils import to_wei
99

1010
from .constant import ABI_WETH, CHAIN_ID, ADDRESS_WETH, IM_WETH
@@ -36,7 +36,8 @@ def home():
3636
button2_action='tx',
3737
button2_target=url_for('tx_withdraw', _external=True, value=to_wei(0.01, 'ether')),
3838
input_text='WETH amount',
39-
post_url=url_for('home', _external=True)
39+
post_url=url_for('home', _external=True),
40+
max_age=3600
4041
)
4142

4243

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# requirements.txt
2-
framelib~=0.0.3
2+
framelib~=0.0.4b3
33
Flask~=3.0.1
44
pydantic

framelib/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
"""
44

55
from .frame import frame, message
6+
from .hub import validate_message, validate_message_or_mock
67
from .models import FrameMessage, ValidatedMessage, User
78
from .warpcast import get_user
8-
from .neynar import validate_message, validate_message_or_mock, validate_message_or_mock_vercel
9+
from .neynar import (
10+
validate_message as validate_message_neynar,
11+
validate_message_or_mock as validate_message_or_mock_neynar
12+
)
913
from .transaction import transaction

framelib/hub.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,22 @@ def validate_message(
6060
return action
6161

6262

63-
def validate_message_or_mock(msg: FrameMessage, api_key: str, mock: bool = False) -> ValidatedMessage:
63+
def validate_message_or_mock(
64+
msg: FrameMessage,
65+
hub: str,
66+
username: str = None,
67+
password: str = None,
68+
api_key: str = None,
69+
mock: bool = False
70+
) -> ValidatedMessage:
6471
if mock:
6572
# mock
6673
return ValidatedMessage(
6774
data=ValidatedData(
6875
type='MESSAGE_TYPE_FRAME_ACTION',
6976
fid=msg.untrustedData.fid,
7077
timestamp=msg.untrustedData.timestamp,
71-
network=msg.untrustedData.network,
78+
network=str(msg.untrustedData.network),
7279
frameActionBody=FrameAction(
7380
url=msg.untrustedData.url,
7481
buttonIndex=msg.untrustedData.buttonIndex,
@@ -78,16 +85,11 @@ def validate_message_or_mock(msg: FrameMessage, api_key: str, mock: bool = False
7885
transactionId=msg.untrustedData.transactionId
7986
)
8087
),
81-
hash=msg.untrustedData.hash,
88+
hash=msg.untrustedData.messageHash,
8289
hashScheme='HASH_SCHEME_BLAKE',
8390
signature='',
84-
signature_scheme='SIGNATURE_SCHEME_ED25519',
91+
signatureScheme='SIGNATURE_SCHEME_ED25519',
8592
signer=''
8693
)
8794

88-
return validate_message(msg, api_key)
89-
90-
91-
def validate_message_or_mock_vercel(msg: FrameMessage, api_key: str) -> ValidatedMessage:
92-
vercel_env = os.getenv('VERCEL_ENV')
93-
return validate_message_or_mock(msg, api_key, vercel_env is None or vercel_env == 'development')
95+
return validate_message(msg, hub, username=username, password=password, api_key=api_key)

framelib/neynar.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
NeynarButton, NeynarInput, NeynarState, NeynarTransaction
1212

1313

14-
def get_frame_action(msg: str, api_key: str) -> NeynarValidatedMessage:
14+
def get_frame_message(msg: str, api_key: str) -> NeynarValidatedMessage:
1515
if not api_key:
1616
raise ValueError('neynar api key not set')
1717
url = 'https://api.neynar.com/v2/farcaster/frame/validate'
@@ -38,7 +38,7 @@ def get_frame_action(msg: str, api_key: str) -> NeynarValidatedMessage:
3838

3939

4040
def validate_message(msg: FrameMessage, api_key: str) -> NeynarValidatedMessage:
41-
action = get_frame_action(msg.trustedData.messageBytes, api_key)
41+
action = get_frame_message(msg.trustedData.messageBytes, api_key)
4242

4343
if msg.untrustedData.fid != action.interactor.fid:
4444
raise ValueError(f'fid does not match: {msg.untrustedData.fid} {action.interactor.fid}')
@@ -83,8 +83,3 @@ def validate_message_or_mock(msg: FrameMessage, api_key: str, mock: bool = False
8383
)
8484

8585
return validate_message(msg, api_key)
86-
87-
88-
def validate_message_or_mock_vercel(msg: FrameMessage, api_key: str) -> NeynarValidatedMessage:
89-
vercel_env = os.getenv('VERCEL_ENV')
90-
return validate_message_or_mock(msg, api_key, vercel_env is None or vercel_env == 'development')

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
setuptools.setup(
77
name='framelib',
8-
version='0.0.3',
8+
version='0.0.4b3',
99
author='Devin A. Conley',
1010
author_email='devinaconley@gmail.com',
1111
description='lightweight library for building farcaster frames using python and flask',

test/test_validation.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
# src
99
from framelib import validate_message
10-
from framelib.neynar import get_frame_action
10+
from framelib.neynar import get_frame_message
1111
from framelib.hub import get_message
1212

1313

@@ -16,7 +16,7 @@ class TestValidateMessageNeynar(object):
1616
def test_button_1(self):
1717
# example signed message from fid 8268 clicking button 1
1818
msg = '0a4e080d10cc4018cbe1a230200182013f0a2068747470733a2f2f707974686f6e2d6672616d652e76657263656c2e6170702f10011a1908cc401214000000000000000000000000000000000000000112140101bf04a2e61cb24c9a66c047ac5ed175e1bed8180122403feee9d0c1392c1e5bc7bca49850f83735c53b4f60c88959ffc271123e333a196e963d15619125e6034acda36076c709182daa5625e4affe6df21866c204830828013220ad4520314a78bc4317c604a3324ebc25bd8215c3ac38342fd790b7905c291bd1'
19-
action = get_frame_action(msg, 'NEYNAR_API_DOCS')
19+
action = get_frame_message(msg, 'NEYNAR_API_DOCS')
2020
assert action.tapped_button.index == 1
2121
assert action.interactor.fid == 8268
2222
assert action.input is None

0 commit comments

Comments
 (0)