| from fastapi import FastAPI,Request,HTTPException,Response |
| from pydantic import BaseModel |
| from fastapi.responses import JSONResponse |
| from components.mongodbconnection import provideClient |
| from components.checkaccountexists import checkAccount |
| from components.endpointscheck import checkEndpoints |
| from components.dynamicendpointscheck import checkDynamicEndpoints |
| from components.updatedynamicendpoint import UpdateDynamicEndpoint |
| from components.getinvoices import GetInvoices |
| from components.updateendpointprice import UpdateEndpointPrice |
| from components.updatedynamicendpointprice import UpdateDynamicEndpointPrice |
| from openkitx403 import OpenKit403Middleware |
| import uuid |
| from fastapi.middleware.cors import CORSMiddleware |
| import json |
| import base64 |
| from components.checktoken import TokenCheck |
| from components.middleware import x401Kit |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| app=FastAPI() |
|
|
|
|
|
|
|
|
|
|
| client=provideClient() |
| origins=[ |
| "http://localhost:3000", |
| "http://localhost:3001" |
| ] |
|
|
| app.add_middleware( |
| CORSMiddleware, |
| allow_origins=origins, |
| allow_credentials=True, |
| allow_methods=["*"], |
| allow_headers=["*"], |
| ) |
|
|
| ''' |
| app.add_middleware( |
| OpenKit403Middleware, |
| audience="https://itsvelocity-velocity.hf.space/", |
| issuer="my-api-v1", |
| #token_gate=TokenCheck, |
| excluded_paths=[ |
| "/setupaccount", |
| "/checkaccount", |
| "/register_endpoint", |
| "/register_dynamic_endpoint", |
| "/delete_endpoint", |
| "/delete_dynamic_endpoint", |
| "/checkendpoints", |
| "/checkdynamicendpoints", |
| "/update_dynamic_endpoint", |
| "/update_endpoint_price", |
| "/update_dynamic_endpoint_price", |
| "/docs", |
| "/openapi.json", |
| "/invoices" |
| |
| ] |
| ) |
| ''' |
|
|
|
|
|
|
| app.add_middleware( |
| x401Kit, |
| protected_paths=[ |
| "/custom_account_login" |
| ], |
| required_mint="3d4XyPWkUJzruF5c2qc1QfpLgsaNaDLMtTya1bWBpump", |
| mint_amount=100000, |
| helius_api_key="", |
| geo_code=False, |
| geo_code_locs=["IN"] |
| ) |
|
|
|
|
|
|
|
|
| db=client["x402ify_db"] |
| coll=db["x402ify_col"] |
| marketplace=db["x402marketplace"] |
| sdkdb=db["sdklogs_db"] |
| sdkcol=sdkdb["sdklogs_col"] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| class SetupPayload(BaseModel): |
| owner:str |
|
|
|
|
|
|
|
|
| class RegisterPayload(BaseModel): |
|
|
| endpoint:str |
| owner:str |
| description:str |
| meta:str |
| price:str |
| |
|
|
|
|
|
|
| class RegisterPayloadDynamic(BaseModel): |
| |
| endpoint:str |
| owner:str |
| description:str |
| tag:str |
| meta:str |
| price:str |
| |
|
|
|
|
|
|
| class RegisterAgent(BaseModel): |
| agent:str |
| owner:str |
| description:str |
| meta:str |
| price:str |
| |
|
|
|
|
|
|
|
|
|
|
|
|
| class Update(BaseModel): |
| owner:str |
| tag:str |
| newendpoint:str |
|
|
|
|
|
|
|
|
| class Owner(BaseModel): |
| owner:str |
|
|
|
|
| class Delete(BaseModel): |
| owner:str |
| endpoint_linker:str |
|
|
|
|
| class Invoice(BaseModel): |
| owner:str |
|
|
|
|
| class UpdatePrice(BaseModel): |
| owner:str |
| endpoint_linker:str |
| price:str |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| def saveToMarket(payload): |
|
|
| |
| marketplace.update_one( |
| {"owner": "system"}, |
| {"$push": {"market": payload}} |
| |
| ) |
| |
|
|
|
|
|
|
|
|
| def UpdateMarketData(endpoint_method,endpoint_linker,status_code): |
|
|
| |
| call_success = 200 <= status_code < 300 |
| |
| marketplace.update_one( |
| { "owner": "system" }, |
| { |
| "$set": { |
| "market.$[elem].endpoint_method":endpoint_method, |
| }, |
| "$inc": { |
| "market.$[elem].calls": 1, |
| "market.$[elem].failures": 0 if call_success else 1 |
| } |
| }, |
| array_filters=[{ "elem.endpoint_linker": endpoint_linker }] |
| |
| ); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
| |
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
| @app.post("/tester") |
| async def Tester(request:Request): |
| body=await request.json() |
| return {"data":body.get("name")} |
|
|
|
|
|
|
|
|
|
|
| @app.get("/accountlogin") |
| def AccountLogin(request:Request): |
| return {"message":"login"} |
|
|
|
|
|
|
| @app.get("/custom_account_login") |
| def CustomAccountLogin(request:Request): |
| return {"address":""} |
|
|
|
|
|
|
| |
|
|
| @app.post("/setupaccount") |
| def SetupAccount(data:Owner): |
| |
| |
| payload={ |
| |
| "owner":data.owner, |
| "endpoints":[], |
| "dynamicendpoints":[], |
| "agents":[] |
|
|
| } |
| coll.insert_one(payload) |
| return {"status":True} |
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
| @app.post("/checkaccount") |
| def checkaccount(data:Owner): |
| status=checkAccount(data.owner) |
| print(data) |
| if status==True: |
| return {'status':True} |
| else: |
| return {"status":False} |
| |
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
| @app.post("/register_endpoint") |
| def RegisterEndpoint(data:RegisterPayload): |
|
|
| |
| try: |
|
|
|
|
| document=coll.find_one({'owner':data.owner}) |
| endpoints=document["endpoints"] |
| if len(endpoints) > 0: |
| for endpointobject in endpoints: |
| if endpointobject["endpoint"]==data.endpoint: |
| return {"status":False,"message":"endpoint already present"} |
| |
| |
| short_id = str(uuid.uuid4())[:5] |
| short_id_e=short_id+"x402" |
| payload={ |
| "owner":data.owner, |
| "endpoint":data.endpoint, |
| "meta":data.meta, |
| "endpoint_linker":short_id_e, |
| "price":data.price, |
| "invoices":[] |
| |
| } |
|
|
| |
|
|
| coll.update_one( |
| {"owner": data.owner}, |
| {"$push": {"endpoints": payload}} |
| |
| ) |
|
|
| marketpayload={ |
| |
| "owner":data.owner, |
| "endpoint_linker":short_id_e, |
| "meta":data.meta, |
| "description":data.description, |
| "endpoint_method":"", |
| "price":data.price, |
| "endpoint_mcp_base":"https://mcpv100-production.up.railway.app/mcp:8080", |
| "calls":0, |
| "failures":0 |
| |
| |
| } |
|
|
| saveToMarket(marketpayload) |
|
|
| |
| return {"status":True,"x402ify_tag":short_id_e,"message":"done"} |
| |
| except Exception as e: |
| return {"status":False,"x402ify_tag":str(e),"message":"error"} |
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
| @app.post("/register_dynamic_endpoint") |
| async def RegisterDynamicEndpoint(data:RegisterPayloadDynamic): |
| |
| try: |
|
|
|
|
|
|
| document=coll.find_one({'owner':data.owner}) |
| endpoints=document["dynamicendpoints"] |
| if len(endpoints) > 0: |
| for endpointobject in endpoints: |
| if endpointobject["endpoint"]==data.endpoint: |
| return {"status":False,"message":"endpoint already present"} |
| |
| payload={ |
| |
| |
| "owner":data.owner, |
| "endpoint":data.endpoint, |
| "description":data.description, |
| "meta":data.meta, |
| "endpoint_linker":f"{data.tag}", |
| "price":data.price, |
| "invoices":[] |
| |
| } |
| |
|
|
| coll.update_one( |
| {"owner": data.owner}, |
| {"$push": {"dynamicendpoints": payload}} |
|
|
|
|
| |
| ) |
|
|
|
|
|
|
| marketpayload={ |
| |
| "owner":data.owner, |
| "endpoint_linker":short_id_e, |
| "meta":data.meta, |
| "description":data.description, |
| "endpoint_method":"", |
| "price":data.price, |
| "endpoint_mcp_base":"https://mcpv100-production.up.railway.app/mcp:8080", |
| "calls":0, |
| "failures":0 |
| |
| |
| } |
| |
|
|
| saveToMarket(marketpayload) |
|
|
| |
| return {"status":True,"x402ify_tag":f"{data.tag}","message":"done"} |
| |
| except Exception as e: |
| return {"status":False,"x402ify_tag":str(e),"message":"error"} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
| @app.post("/delete_endpoint") |
| def DeleteEndpoint(data:Delete): |
|
|
| try: |
| coll.update_one( |
| {"owner": data.owner}, |
| {"$pull": {"endpoints": {"endpoint_linker": data.endpoint_linker}}}) |
| return {"status":True} |
|
|
| except Exception as e: |
| return {"status":False} |
|
|
|
|
| |
|
|
| |
|
|
|
|
|
|
| @app.post("/delete_dynamic_endpoint") |
| def DeleteDynamicEndpoint(data:Delete): |
|
|
| try: |
| coll.update_one( |
| {"owner": data.owner}, |
| {"$pull": {"dynamicendpoints": {"endpoint_linker": data.endpoint_linker}}}) |
| return {"status":True} |
|
|
| except Exception as e: |
| return {"status":False} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
| @app.post("/checkendpoints") |
| def checkEP(data:Owner): |
| print(data.owner) |
| endpoints=checkEndpoints(data.owner) |
| return endpoints |
|
|
|
|
| |
|
|
|
|
| @app.post("/checkdynamicendpoints") |
| def checkDEP(data:Owner): |
| dendpoints=checkDynamicEndpoints(data.owner) |
| return dendpoints |
|
|
|
|
|
|
|
|
|
|
| |
|
|
| @app.post("/update_dynamic_endpoint") |
| def UpdateDynamic(data:Update): |
| print(data.tag) |
| status=UpdateDynamicEndpoint(data.owner,data.tag,data.newendpoint) |
| return status |
|
|
|
|
|
|
| @app.post("/update_endpoint_price") |
| def UpdateEndpointPriceRoute(data:UpdatePrice): |
| |
| |
| status=UpdateEndpointPrice(data.owner,data.endpoint_linker,data.price) |
| return status |
|
|
|
|
|
|
| @app.post("/update_dynamic_endpoint_price") |
| def UpdateDynamicEndpointPriceRoute(data:UpdatePrice): |
| |
| |
| status=UpdateDynamicEndpointPrice(data.owner,data.endpoint_linker,data.price) |
| return status |
|
|
|
|
|
|
| |
|
|
| |
|
|
|
|
| @app.post("/invoices") |
| def getaudit(data:Invoice): |
| invoices=GetInvoices(data.owner) |
| result = [] |
|
|
| for item in invoices: |
| |
| owner = item.get("owner") |
| endpoint = item.get("endpoint") |
| endpoint_linker = item.get("endpoint_linker") |
| signature = item.get("signature") |
|
|
| |
| payment = item["details"]["payment_request"] |
|
|
| |
| if "accepts" in payment: |
| pay_info = payment["accepts"][0] |
| else: |
| pay_info = payment |
|
|
| payTo = pay_info.get("payTo") |
| asset = pay_info.get("asset") |
| amount = pay_info.get("maxAmountRequired") |
|
|
| result.append({ |
| "owner": owner, |
| "endpoint_linker": endpoint_linker, |
| "endpoint": endpoint, |
| "signature": signature, |
| "payTo": payTo, |
| "asset": asset, |
| "amount": amount |
| }) |
| |
| return {"invoices":result} |
|
|
| |
|
|
|
|
|
|
|
|
|
|
| @app.get("/marketdata") |
| def MarketData(request:Request): |
| marketdocument=marketplace.find_one({"owner":"system"}) |
| marketdata=marketdocument["market"] |
| return {"market":marketdata} |
| |
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
| @app.get("/sdklogs/{id}") |
| def SDKLog(id): |
| document=col.find_one({"owner":"system"}) |
| details=None |
| if document: |
| logs=document["logs"] |
| for data in logs: |
| if data.signer==id: |
| details=data |
| |
| return JSONResponse(content={"details":details}) |
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
| |
|
|
|
|
|
|
| |
|
|
| |
|
|
|
|
| |
|
|
|
|
| |
|
|
|
|
| |
| |
| |
| |
|
|
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
| |
|
|
|
|