forked from coinbase/x402
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhooks.py
More file actions
105 lines (72 loc) · 2.45 KB
/
hooks.py
File metadata and controls
105 lines (72 loc) · 2.45 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
105
"""Server lifecycle hooks example."""
import os
from pprint import pprint
from dotenv import load_dotenv
from fastapi import FastAPI
from pydantic import BaseModel
from x402.http import FacilitatorConfig, HTTPFacilitatorClient, PaymentOption
from x402.http.middleware.fastapi import PaymentMiddlewareASGI
from x402.http.types import RouteConfig
from x402.mechanisms.evm.exact import ExactEvmServerScheme
from x402.schemas import Network
from x402.server import x402ResourceServer
load_dotenv()
# Config
EVM_ADDRESS = os.getenv("EVM_ADDRESS")
EVM_NETWORK: Network = "eip155:84532" # Base Sepolia
FACILITATOR_URL = os.getenv("FACILITATOR_URL", "https://x402.org/facilitator")
if not EVM_ADDRESS:
raise ValueError("Missing required EVM_ADDRESS environment variable")
class WeatherReport(BaseModel):
weather: str
temperature: int
class WeatherResponse(BaseModel):
report: WeatherReport
app = FastAPI()
facilitator = HTTPFacilitatorClient(FacilitatorConfig(url=FACILITATOR_URL))
server = x402ResourceServer(facilitator)
server.register(EVM_NETWORK, ExactEvmServerScheme())
# Register async hooks
async def before_verify(ctx):
print("\n=== Before verify ===")
pprint(vars(ctx))
async def after_verify(ctx):
print("\n=== After verify ===")
pprint(vars(ctx))
async def verify_failure(ctx):
print("\n=== Verify failure ===")
pprint(vars(ctx))
async def before_settle(ctx):
print("\n=== Before settle ===")
pprint(vars(ctx))
async def after_settle(ctx):
print("\n=== After settle ===")
pprint(vars(ctx))
async def settle_failure(ctx):
print("\n=== Settle failure ===")
pprint(vars(ctx))
server.on_before_verify(before_verify)
server.on_after_verify(after_verify)
server.on_verify_failure(verify_failure)
server.on_before_settle(before_settle)
server.on_after_settle(after_settle)
server.on_settle_failure(settle_failure)
routes = {
"GET /weather": RouteConfig(
accepts=[
PaymentOption(
scheme="exact",
pay_to=EVM_ADDRESS,
price="$0.001",
network=EVM_NETWORK,
),
],
),
}
app.add_middleware(PaymentMiddlewareASGI, routes=routes, server=server)
@app.get("/weather")
async def get_weather(city: str = "San Francisco") -> WeatherResponse:
return WeatherResponse(report=WeatherReport(weather="sunny", temperature=70))
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=4021)