mirror of
https://github.com/aljazceru/nutshell.git
synced 2025-12-20 10:34:20 +01:00
context
This commit is contained in:
@@ -2,13 +2,19 @@ import asyncio
|
||||
import logging
|
||||
import sys
|
||||
|
||||
from fastapi import FastAPI
|
||||
from fastapi import FastAPI, Request
|
||||
from loguru import logger
|
||||
|
||||
from cashu.core.settings import DEBUG, VERSION
|
||||
from cashu.lightning import WALLET
|
||||
from cashu.mint.migrations import m001_initial
|
||||
|
||||
from starlette_context.middleware import RawContextMiddleware
|
||||
from starlette_context import context
|
||||
from starlette.middleware import Middleware
|
||||
from starlette.requests import Request as StarletteRequest
|
||||
|
||||
|
||||
from . import ledger
|
||||
from .router import router
|
||||
from .startup import load_ledger
|
||||
@@ -49,6 +55,15 @@ def create_app(config_object="core.settings") -> FastAPI:
|
||||
|
||||
configure_logger()
|
||||
|
||||
middleware = [
|
||||
Middleware(
|
||||
RawContextMiddleware,
|
||||
),
|
||||
Middleware(
|
||||
RawContextMiddleware,
|
||||
),
|
||||
]
|
||||
|
||||
app = FastAPI(
|
||||
title="Cashu Mint",
|
||||
description="Ecash wallet and mint with Bitcoin Lightning support.",
|
||||
@@ -57,8 +72,8 @@ def create_app(config_object="core.settings") -> FastAPI:
|
||||
"name": "MIT License",
|
||||
"url": "https://raw.githubusercontent.com/callebtc/cashu/main/LICENSE",
|
||||
},
|
||||
middleware=middleware,
|
||||
)
|
||||
|
||||
return app
|
||||
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ from typing import Dict, List, Set
|
||||
|
||||
from loguru import logger
|
||||
|
||||
import cashu.core.legacy as legacy
|
||||
import cashu.core.b_dhke as b_dhke
|
||||
import cashu.core.bolt11 as bolt11
|
||||
from cashu.core.base import (
|
||||
@@ -36,6 +37,8 @@ from cashu.mint.crud import (
|
||||
update_lightning_invoice,
|
||||
)
|
||||
|
||||
from starlette_context import context
|
||||
|
||||
|
||||
class Ledger:
|
||||
def __init__(self, secret_key: str, db: str, derivation_path=""):
|
||||
@@ -113,6 +116,9 @@ class Ledger:
|
||||
|
||||
C = PublicKey(bytes.fromhex(proof.C), raw=True)
|
||||
|
||||
# backwards compatibility with old hash_to_curve
|
||||
if not context.get("version"):
|
||||
return legacy.verify_pre_0_3_3(secret_key, C, proof.secret)
|
||||
return b_dhke.verify(secret_key, C, proof.secret)
|
||||
|
||||
def _verify_script(self, idx: int, proof: Proof):
|
||||
|
||||
@@ -20,6 +20,10 @@ from cashu.mint import ledger
|
||||
router: APIRouter = APIRouter()
|
||||
|
||||
|
||||
from starlette.requests import Request
|
||||
from starlette_context import context
|
||||
|
||||
|
||||
@router.get("/keys")
|
||||
def keys():
|
||||
"""Get the public keys of the mint"""
|
||||
@@ -49,7 +53,6 @@ async def request_mint(amount: int = 0):
|
||||
@router.post("/mint")
|
||||
async def mint(
|
||||
payloads: MintRequest,
|
||||
bolt11: Union[str, None] = None,
|
||||
payment_hash: Union[str, None] = None,
|
||||
):
|
||||
"""
|
||||
@@ -70,10 +73,12 @@ async def mint(
|
||||
|
||||
|
||||
@router.post("/melt")
|
||||
async def melt(payload: MeltRequest):
|
||||
async def melt(request: Request, payload: MeltRequest):
|
||||
"""
|
||||
Requests tokens to be destroyed and sent out via Lightning.
|
||||
"""
|
||||
context["version"] = request.headers.get("Client-version")
|
||||
print(context["version"])
|
||||
ok, preimage = await ledger.melt(payload.proofs, payload.invoice)
|
||||
resp = GetMeltResponse(paid=ok, preimage=preimage)
|
||||
return resp
|
||||
@@ -97,11 +102,13 @@ async def check_fees(payload: CheckFeesRequest):
|
||||
|
||||
|
||||
@router.post("/split")
|
||||
async def split(payload: SplitRequest):
|
||||
async def split(request: Request, payload: SplitRequest):
|
||||
"""
|
||||
Requetst a set of tokens with amount "total" to be split into two
|
||||
newly minted sets with amount "split" and "total-split".
|
||||
"""
|
||||
context["version"] = request.headers.get("Client-version")
|
||||
print(context["version"])
|
||||
proofs = payload.proofs
|
||||
amount = payload.amount
|
||||
outputs = payload.outputs.blinded_messages if payload.outputs else None
|
||||
|
||||
@@ -30,7 +30,7 @@ from cashu.core.script import (
|
||||
step2_carol_sign_tx,
|
||||
)
|
||||
from cashu.core.secp import PublicKey
|
||||
from cashu.core.settings import DEBUG
|
||||
from cashu.core.settings import DEBUG, VERSION
|
||||
from cashu.core.split import amount_split
|
||||
from cashu.wallet.crud import (
|
||||
get_keyset,
|
||||
@@ -52,7 +52,10 @@ class LedgerAPI:
|
||||
self.url = url
|
||||
|
||||
async def _get_keys(self, url):
|
||||
resp = requests.get(url + "/keys").json()
|
||||
resp = requests.get(
|
||||
url + "/keys",
|
||||
headers={"Client-version": VERSION},
|
||||
).json()
|
||||
keys = resp
|
||||
assert len(keys), Exception("did not receive any keys")
|
||||
keyset_keys = {
|
||||
@@ -63,7 +66,10 @@ class LedgerAPI:
|
||||
return keyset
|
||||
|
||||
async def _get_keysets(self, url):
|
||||
keysets = requests.get(url + "/keysets").json()
|
||||
keysets = requests.get(
|
||||
url + "/keysets",
|
||||
headers={"Client-version": VERSION},
|
||||
).json()
|
||||
assert len(keysets), Exception("did not receive any keysets")
|
||||
return keysets
|
||||
|
||||
@@ -177,6 +183,7 @@ class LedgerAPI:
|
||||
self.url + "/mint",
|
||||
json=payloads.dict(),
|
||||
params={"payment_hash": payment_hash},
|
||||
headers={"Client-version": VERSION},
|
||||
)
|
||||
resp.raise_for_status()
|
||||
try:
|
||||
@@ -235,6 +242,7 @@ class LedgerAPI:
|
||||
resp = requests.post(
|
||||
self.url + "/split",
|
||||
json=split_payload.dict(include=_splitrequest_include_fields(proofs)),
|
||||
headers={"Client-version": VERSION},
|
||||
)
|
||||
resp.raise_for_status()
|
||||
try:
|
||||
@@ -260,6 +268,7 @@ class LedgerAPI:
|
||||
resp = requests.post(
|
||||
self.url + "/check",
|
||||
json=payload.dict(),
|
||||
headers={"Client-version": VERSION},
|
||||
)
|
||||
resp.raise_for_status()
|
||||
return_dict = resp.json()
|
||||
@@ -272,6 +281,7 @@ class LedgerAPI:
|
||||
resp = requests.post(
|
||||
self.url + "/checkfees",
|
||||
json=payload.dict(),
|
||||
headers={"Client-version": VERSION},
|
||||
)
|
||||
resp.raise_for_status()
|
||||
|
||||
@@ -293,6 +303,7 @@ class LedgerAPI:
|
||||
resp = requests.post(
|
||||
self.url + "/melt",
|
||||
json=payload.dict(include=_meltequest_include_fields(proofs)),
|
||||
headers={"Client-version": VERSION},
|
||||
)
|
||||
resp.raise_for_status()
|
||||
|
||||
|
||||
19
poetry.lock
generated
19
poetry.lock
generated
@@ -167,7 +167,7 @@ starlette = "0.19.1"
|
||||
[package.extras]
|
||||
all = ["email_validator (>=1.1.1,<2.0.0)", "itsdangerous (>=1.1.0,<3.0.0)", "jinja2 (>=2.11.2,<4.0.0)", "orjson (>=3.2.1,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "pyyaml (>=5.3.1,<7.0.0)", "requests (>=2.24.0,<3.0.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)", "uvicorn[standard] (>=0.12.0,<0.18.0)"]
|
||||
dev = ["autoflake (>=1.4.0,<2.0.0)", "flake8 (>=3.8.3,<6.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "pre-commit (>=2.17.0,<3.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "uvicorn[standard] (>=0.12.0,<0.18.0)"]
|
||||
doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.2)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer (>=0.4.1,<0.5.0)"]
|
||||
doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer (>=0.4.1,<0.5.0)"]
|
||||
test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==22.3.0)", "databases[sqlite] (>=0.3.2,<0.6.0)", "email_validator (>=1.1.1,<2.0.0)", "flake8 (>=3.8.3,<6.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.14.0,<0.19.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "orjson (>=3.2.1,<4.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=6.2.4,<7.0.0)", "pytest-cov (>=2.12.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "requests (>=2.24.0,<3.0.0)", "sqlalchemy (>=1.3.18,<1.5.0)", "types-dataclasses (==0.6.5)", "types-orjson (==3.6.2)", "types-ujson (==4.2.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"]
|
||||
|
||||
[[package]]
|
||||
@@ -553,6 +553,17 @@ typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""
|
||||
[package.extras]
|
||||
full = ["itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests"]
|
||||
|
||||
[[package]]
|
||||
name = "starlette-context"
|
||||
version = "0.3.4"
|
||||
description = "Access context in Starlette"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
|
||||
[package.dependencies]
|
||||
starlette = "*"
|
||||
|
||||
[[package]]
|
||||
name = "tomli"
|
||||
version = "2.0.1"
|
||||
@@ -632,7 +643,7 @@ testing = ["func-timeout", "jaraco.itertools", "pytest (>=6)", "pytest-black (>=
|
||||
[metadata]
|
||||
lock-version = "1.1"
|
||||
python-versions = "^3.7"
|
||||
content-hash = "b4e980ee90226bab07750b1becc8c69df7752f6d168d200a79c782aa1efe61da"
|
||||
content-hash = "14ff9c57ca971c645f1a075b5c6fa0a84a38eaf6399d14afa724136728a3da03"
|
||||
|
||||
[metadata.files]
|
||||
anyio = [
|
||||
@@ -999,6 +1010,10 @@ starlette = [
|
||||
{file = "starlette-0.19.1-py3-none-any.whl", hash = "sha256:5a60c5c2d051f3a8eb546136aa0c9399773a689595e099e0877704d5888279bf"},
|
||||
{file = "starlette-0.19.1.tar.gz", hash = "sha256:c6d21096774ecb9639acad41b86b7706e52ba3bf1dc13ea4ed9ad593d47e24c7"},
|
||||
]
|
||||
starlette-context = [
|
||||
{file = "starlette_context-0.3.4-py37-none-any.whl", hash = "sha256:b16bf17bd3ead7ded2f458aebf7f913744b9cf28305e16c69b435a6c6ddf1135"},
|
||||
{file = "starlette_context-0.3.4.tar.gz", hash = "sha256:2d28e1838302fb5d5adacadc10fb73fb2d5cca1f0aa1e279698701cc96f1567c"},
|
||||
]
|
||||
tomli = [
|
||||
{file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
|
||||
{file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
|
||||
|
||||
@@ -22,6 +22,7 @@ bitstring = "^3.1.9"
|
||||
secp256k1 = "^0.14.0"
|
||||
sqlalchemy-aio = "^0.17.0"
|
||||
python-bitcoinlib = "^0.11.2"
|
||||
starlette-context = "^0.3.4"
|
||||
|
||||
[tool.poetry.dev-dependencies]
|
||||
black = {version = "^22.8.0", allow-prereleases = true}
|
||||
|
||||
Reference in New Issue
Block a user