diff --git a/.env.example b/.env.example index 898f90bd..b7fb9f06 100644 --- a/.env.example +++ b/.env.example @@ -103,8 +103,3 @@ ECLAIR_PASS=eclairpw # Enter /api in LightningTipBot to get your key LNTIPS_API_KEY=LNTIPS_ADMIN_KEY LNTIPS_API_ENDPOINT=https://ln.tips - -# Cashu Mint -# Use a long-enough random (!) private key. -# Once set, you cannot change this key as for now. -CASHU_PRIVATE_KEY="SuperSecretPrivateKey" diff --git a/.github/codecov.yml b/.github/codecov.yml deleted file mode 100644 index e190e6aa..00000000 --- a/.github/codecov.yml +++ /dev/null @@ -1,9 +0,0 @@ -coverage: - status: - patch: off - project: - default: - target: auto - # adjust accordingly based on how flaky your tests are - # this allows a 10% drop from the previous base commit coverage - threshold: 10% \ No newline at end of file diff --git a/lnbits/commands.py b/lnbits/commands.py index 89739076..0f7454f2 100644 --- a/lnbits/commands.py +++ b/lnbits/commands.py @@ -65,14 +65,14 @@ async def migrate_databases(): (db_name, version, version), ) - async def run_migration(db, migrations_module, db_name): + async def run_migration(db, migrations_module): + db_name = migrations_module.__name__.split(".")[-2] for key, migrate in migrations_module.__dict__.items(): match = match = matcher.match(key) if match: version = int(match.group(1)) if version > current_versions.get(db_name, 0): logger.debug(f"running migration {db_name}.{version}") - logger.debug(f"db = {db}") await migrate(db) if db.schema == None: @@ -97,24 +97,20 @@ async def migrate_databases(): rows = await (await conn.execute("SELECT * FROM dbversions")).fetchall() current_versions = {row["db"]: row["version"] for row in rows} matcher = re.compile(r"^m(\d\d\d)_") - db_name = core_migrations.__name__.split(".")[-2] - await run_migration(conn, core_migrations, db_name) + await run_migration(conn, core_migrations) for ext in get_valid_extensions(): try: - - module_str = ( - ext.migration_module or f"lnbits.extensions.{ext.code}.migrations" + ext_migrations = importlib.import_module( + f"lnbits.extensions.{ext.code}.migrations" ) - ext_migrations = importlib.import_module(module_str) ext_db = importlib.import_module(f"lnbits.extensions.{ext.code}").db - db_name = ext.db_name or module_str.split(".")[-2] except ImportError: raise ImportError( f"Please make sure that the extension `{ext.code}` has a migrations file." ) async with ext_db.connect() as ext_conn: - await run_migration(ext_conn, ext_migrations, db_name) + await run_migration(ext_conn, ext_migrations) logger.info("✔️ All migrations done.") diff --git a/lnbits/extensions/cashu/README.md b/lnbits/extensions/cashu/README.md deleted file mode 100644 index 8f53b474..00000000 --- a/lnbits/extensions/cashu/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Cashu - -## Create ecash mint for pegging in/out of ecash - - - -### Usage - -1. Enable extension -2. Create a Mint -3. Share wallet diff --git a/lnbits/extensions/cashu/__init__.py b/lnbits/extensions/cashu/__init__.py deleted file mode 100644 index e6507bba..00000000 --- a/lnbits/extensions/cashu/__init__.py +++ /dev/null @@ -1,48 +0,0 @@ -import asyncio - -from environs import Env # type: ignore -from fastapi import APIRouter -from fastapi.staticfiles import StaticFiles - -from lnbits.db import Database -from lnbits.helpers import template_renderer -from lnbits.tasks import catch_everything_and_restart - -db = Database("ext_cashu") - -import sys - -cashu_static_files = [ - { - "path": "/cashu/static", - "app": StaticFiles(directory="lnbits/extensions/cashu/static"), - "name": "cashu_static", - } -] -from cashu.mint.ledger import Ledger - -env = Env() -env.read_env() - -ledger = Ledger( - db=db, - seed=env.str("CASHU_PRIVATE_KEY", default="SuperSecretPrivateKey"), - derivation_path="0/0/0/1", -) - -cashu_ext: APIRouter = APIRouter(prefix="/cashu", tags=["cashu"]) - - -def cashu_renderer(): - return template_renderer(["lnbits/extensions/cashu/templates"]) - - -from .tasks import startup_cashu_mint, wait_for_paid_invoices -from .views import * # noqa -from .views_api import * # noqa - - -def cashu_start(): - loop = asyncio.get_event_loop() - loop.create_task(catch_everything_and_restart(startup_cashu_mint)) - loop.create_task(catch_everything_and_restart(wait_for_paid_invoices)) diff --git a/lnbits/extensions/cashu/config.json b/lnbits/extensions/cashu/config.json deleted file mode 100644 index af202d43..00000000 --- a/lnbits/extensions/cashu/config.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "Cashu", - "short_description": "Ecash mint and wallet", - "icon": "account_balance", - "contributors": ["calle", "vlad", "arcbtc"], - "hidden": false -} diff --git a/lnbits/extensions/cashu/config.json.example b/lnbits/extensions/cashu/config.json.example deleted file mode 100644 index 0cb4043d..00000000 --- a/lnbits/extensions/cashu/config.json.example +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "Cashu", - "short_description": "Ecash mints with LN peg in/out", - "icon": "account_balance", - "contributors": ["calle", "vlad", "arcbtc"], - "hidden": true -} diff --git a/lnbits/extensions/cashu/crud.py b/lnbits/extensions/cashu/crud.py deleted file mode 100644 index 773a11fd..00000000 --- a/lnbits/extensions/cashu/crud.py +++ /dev/null @@ -1,63 +0,0 @@ -import os -import random -import time -from binascii import hexlify, unhexlify -from typing import Any, List, Optional, Union - -from cashu.core.base import MintKeyset -from embit import bip32, bip39, ec, script -from embit.networks import NETWORKS -from loguru import logger - -from lnbits.db import Connection, Database -from lnbits.helpers import urlsafe_short_hash - -from . import db -from .models import Cashu, Pegs, Promises, Proof - - -async def create_cashu( - cashu_id: str, keyset_id: str, wallet_id: str, data: Cashu -) -> Cashu: - - await db.execute( - """ - INSERT INTO cashu.cashu (id, wallet, name, tickershort, fraction, maxsats, coins, keyset_id) - VALUES (?, ?, ?, ?, ?, ?, ?, ?) - """, - ( - cashu_id, - wallet_id, - data.name, - data.tickershort, - data.fraction, - data.maxsats, - data.coins, - keyset_id, - ), - ) - - cashu = await get_cashu(cashu_id) - assert cashu, "Newly created cashu couldn't be retrieved" - return cashu - - -async def get_cashu(cashu_id) -> Optional[Cashu]: - row = await db.fetchone("SELECT * FROM cashu.cashu WHERE id = ?", (cashu_id,)) - return Cashu(**row) if row else None - - -async def get_cashus(wallet_ids: Union[str, List[str]]) -> List[Cashu]: - if isinstance(wallet_ids, str): - wallet_ids = [wallet_ids] - - q = ",".join(["?"] * len(wallet_ids)) - rows = await db.fetchall( - f"SELECT * FROM cashu.cashu WHERE wallet IN ({q})", (*wallet_ids,) - ) - - return [Cashu(**row) for row in rows] - - -async def delete_cashu(cashu_id) -> None: - await db.execute("DELETE FROM cashu.cashu WHERE id = ?", (cashu_id,)) diff --git a/lnbits/extensions/cashu/migrations.py b/lnbits/extensions/cashu/migrations.py deleted file mode 100644 index b54c4108..00000000 --- a/lnbits/extensions/cashu/migrations.py +++ /dev/null @@ -1,33 +0,0 @@ -async def m001_initial(db): - """ - Initial cashu table. - """ - await db.execute( - """ - CREATE TABLE cashu.cashu ( - id TEXT PRIMARY KEY, - wallet TEXT NOT NULL, - name TEXT NOT NULL, - tickershort TEXT DEFAULT 'sats', - fraction BOOL, - maxsats INT, - coins INT, - keyset_id TEXT NOT NULL, - issued_sat INT - ); - """ - ) - - """ - Initial cashus table. - """ - await db.execute( - """ - CREATE TABLE cashu.pegs ( - id TEXT PRIMARY KEY, - wallet TEXT NOT NULL, - inout BOOL NOT NULL, - amount INT - ); - """ - ) diff --git a/lnbits/extensions/cashu/models.py b/lnbits/extensions/cashu/models.py deleted file mode 100644 index c820d12e..00000000 --- a/lnbits/extensions/cashu/models.py +++ /dev/null @@ -1,147 +0,0 @@ -from sqlite3 import Row -from typing import List, Union - -from fastapi import Query -from pydantic import BaseModel - - -class Cashu(BaseModel): - id: str = Query(None) - name: str = Query(None) - wallet: str = Query(None) - tickershort: str = Query(None) - fraction: bool = Query(None) - maxsats: int = Query(0) - coins: int = Query(0) - keyset_id: str = Query(None) - - @classmethod - def from_row(cls, row: Row): - return cls(**dict(row)) - - -class Pegs(BaseModel): - id: str - wallet: str - inout: str - amount: str - - @classmethod - def from_row(cls, row: Row): - return cls(**dict(row)) - - -class PayLnurlWData(BaseModel): - lnurl: str - - -class Promises(BaseModel): - id: str - amount: int - B_b: str - C_b: str - cashu_id: str - - -class Proof(BaseModel): - amount: int - secret: str - C: str - reserved: bool = False # whether this proof is reserved for sending - send_id: str = "" # unique ID of send attempt - time_created: str = "" - time_reserved: str = "" - - @classmethod - def from_row(cls, row: Row): - return cls( - amount=row[0], - C=row[1], - secret=row[2], - reserved=row[3] or False, - send_id=row[4] or "", - time_created=row[5] or "", - time_reserved=row[6] or "", - ) - - @classmethod - def from_dict(cls, d: dict): - assert "secret" in d, "no secret in proof" - assert "amount" in d, "no amount in proof" - return cls( - amount=d.get("amount"), - C=d.get("C"), - secret=d.get("secret"), - reserved=d.get("reserved") or False, - send_id=d.get("send_id") or "", - time_created=d.get("time_created") or "", - time_reserved=d.get("time_reserved") or "", - ) - - def to_dict(self): - return dict(amount=self.amount, secret=self.secret, C=self.C) - - def __getitem__(self, key): - return self.__getattribute__(key) - - def __setitem__(self, key, val): - self.__setattr__(key, val) - - -class Proofs(BaseModel): - """TODO: Use this model""" - - proofs: List[Proof] - - -class Invoice(BaseModel): - amount: int - pr: str - hash: str - issued: bool = False - - @classmethod - def from_row(cls, row: Row): - return cls( - amount=int(row[0]), - pr=str(row[1]), - hash=str(row[2]), - issued=bool(row[3]), - ) - - -class BlindedMessage(BaseModel): - amount: int - B_: str - - -class BlindedSignature(BaseModel): - amount: int - C_: str - - @classmethod - def from_dict(cls, d: dict): - return cls( - amount=d["amount"], - C_=d["C_"], - ) - - -class MintPayloads(BaseModel): - blinded_messages: List[BlindedMessage] = [] - - -class SplitPayload(BaseModel): - proofs: List[Proof] - amount: int - output_data: MintPayloads - - -class CheckPayload(BaseModel): - proofs: List[Proof] - - -class MeltPayload(BaseModel): - proofs: List[Proof] - amount: int - invoice: str diff --git a/lnbits/extensions/cashu/static/js/base64.js b/lnbits/extensions/cashu/static/js/base64.js deleted file mode 100644 index b150882f..00000000 --- a/lnbits/extensions/cashu/static/js/base64.js +++ /dev/null @@ -1,37 +0,0 @@ -function unescapeBase64Url(str) { - return (str + '==='.slice((str.length + 3) % 4)) - .replace(/-/g, '+') - .replace(/_/g, '/') -} - -function escapeBase64Url(str) { - return str.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '') -} - -const uint8ToBase64 = (function (exports) { - 'use strict' - - var fromCharCode = String.fromCharCode - var encode = function encode(uint8array) { - var output = [] - - for (var i = 0, length = uint8array.length; i < length; i++) { - output.push(fromCharCode(uint8array[i])) - } - - return btoa(output.join('')) - } - - var asCharCode = function asCharCode(c) { - return c.charCodeAt(0) - } - - var decode = function decode(chars) { - return Uint8Array.from(atob(chars), asCharCode) - } - - exports.decode = decode - exports.encode = encode - - return exports -})({}) diff --git a/lnbits/extensions/cashu/static/js/dhke.js b/lnbits/extensions/cashu/static/js/dhke.js deleted file mode 100644 index 41c2fb46..00000000 --- a/lnbits/extensions/cashu/static/js/dhke.js +++ /dev/null @@ -1,39 +0,0 @@ -async function hashToCurve(secretMessage) { - console.log( - '### secretMessage', - nobleSecp256k1.utils.bytesToHex(secretMessage) - ) - let point - while (!point) { - const hash = await nobleSecp256k1.utils.sha256(secretMessage) - const hashHex = nobleSecp256k1.utils.bytesToHex(hash) - const pointX = '02' + hashHex - console.log('### pointX', pointX) - try { - point = nobleSecp256k1.Point.fromHex(pointX) - console.log('### point', point.toHex()) - } catch (error) { - secretMessage = await nobleSecp256k1.utils.sha256(secretMessage) - } - } - return point -} - -async function step1Alice(secretMessage) { - // todo: document & validate `secretMessage` format - secretMessage = uint8ToBase64.encode(secretMessage) - secretMessage = new TextEncoder().encode(secretMessage) - const Y = await hashToCurve(secretMessage) - const rpk = nobleSecp256k1.utils.randomPrivateKey() - const r = bytesToNumber(rpk) - const P = nobleSecp256k1.Point.fromPrivateKey(r) - const B_ = Y.add(P) - return {B_: B_.toHex(true), r: nobleSecp256k1.utils.bytesToHex(rpk)} -} - -function step3Alice(C_, r, A) { - // const rInt = BigInt(r) - const rInt = bytesToNumber(r) - const C = C_.subtract(A.multiply(rInt)) - return C -} diff --git a/lnbits/extensions/cashu/static/js/noble-secp256k1.js b/lnbits/extensions/cashu/static/js/noble-secp256k1.js deleted file mode 100644 index 6a6bd441..00000000 --- a/lnbits/extensions/cashu/static/js/noble-secp256k1.js +++ /dev/null @@ -1,1178 +0,0 @@ -;(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' - ? factory(exports) - : typeof define === 'function' && define.amd - ? define(['exports'], factory) - : ((global = - typeof globalThis !== 'undefined' ? globalThis : global || self), - factory((global.nobleSecp256k1 = {}))) -})(this, function (exports) { - 'use strict' - - const _nodeResolve_empty = {} - - const nodeCrypto = /*#__PURE__*/ Object.freeze({ - __proto__: null, - default: _nodeResolve_empty - }) - - /*! noble-secp256k1 - MIT License (c) 2019 Paul Miller (paulmillr.com) */ - const _0n = BigInt(0) - const _1n = BigInt(1) - const _2n = BigInt(2) - const _3n = BigInt(3) - const _8n = BigInt(8) - const POW_2_256 = _2n ** BigInt(256) - const CURVE = { - a: _0n, - b: BigInt(7), - P: POW_2_256 - _2n ** BigInt(32) - BigInt(977), - n: POW_2_256 - BigInt('432420386565659656852420866394968145599'), - h: _1n, - Gx: BigInt( - '55066263022277343669578718895168534326250603453777594175500187360389116729240' - ), - Gy: BigInt( - '32670510020758816978083085130507043184471273380659243275938904335757337482424' - ), - beta: BigInt( - '0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee' - ) - } - function weistrass(x) { - const {a, b} = CURVE - const x2 = mod(x * x) - const x3 = mod(x2 * x) - return mod(x3 + a * x + b) - } - const USE_ENDOMORPHISM = CURVE.a === _0n - class JacobianPoint { - constructor(x, y, z) { - this.x = x - this.y = y - this.z = z - } - static fromAffine(p) { - if (!(p instanceof Point)) { - throw new TypeError('JacobianPoint#fromAffine: expected Point') - } - return new JacobianPoint(p.x, p.y, _1n) - } - static toAffineBatch(points) { - const toInv = invertBatch(points.map(p => p.z)) - return points.map((p, i) => p.toAffine(toInv[i])) - } - static normalizeZ(points) { - return JacobianPoint.toAffineBatch(points).map(JacobianPoint.fromAffine) - } - equals(other) { - if (!(other instanceof JacobianPoint)) - throw new TypeError('JacobianPoint expected') - const {x: X1, y: Y1, z: Z1} = this - const {x: X2, y: Y2, z: Z2} = other - const Z1Z1 = mod(Z1 ** _2n) - const Z2Z2 = mod(Z2 ** _2n) - const U1 = mod(X1 * Z2Z2) - const U2 = mod(X2 * Z1Z1) - const S1 = mod(mod(Y1 * Z2) * Z2Z2) - const S2 = mod(mod(Y2 * Z1) * Z1Z1) - return U1 === U2 && S1 === S2 - } - negate() { - return new JacobianPoint(this.x, mod(-this.y), this.z) - } - double() { - const {x: X1, y: Y1, z: Z1} = this - const A = mod(X1 ** _2n) - const B = mod(Y1 ** _2n) - const C = mod(B ** _2n) - const D = mod(_2n * (mod((X1 + B) ** _2n) - A - C)) - const E = mod(_3n * A) - const F = mod(E ** _2n) - const X3 = mod(F - _2n * D) - const Y3 = mod(E * (D - X3) - _8n * C) - const Z3 = mod(_2n * Y1 * Z1) - return new JacobianPoint(X3, Y3, Z3) - } - add(other) { - if (!(other instanceof JacobianPoint)) - throw new TypeError('JacobianPoint expected') - const {x: X1, y: Y1, z: Z1} = this - const {x: X2, y: Y2, z: Z2} = other - if (X2 === _0n || Y2 === _0n) return this - if (X1 === _0n || Y1 === _0n) return other - const Z1Z1 = mod(Z1 ** _2n) - const Z2Z2 = mod(Z2 ** _2n) - const U1 = mod(X1 * Z2Z2) - const U2 = mod(X2 * Z1Z1) - const S1 = mod(mod(Y1 * Z2) * Z2Z2) - const S2 = mod(mod(Y2 * Z1) * Z1Z1) - const H = mod(U2 - U1) - const r = mod(S2 - S1) - if (H === _0n) { - if (r === _0n) { - return this.double() - } else { - return JacobianPoint.ZERO - } - } - const HH = mod(H ** _2n) - const HHH = mod(H * HH) - const V = mod(U1 * HH) - const X3 = mod(r ** _2n - HHH - _2n * V) - const Y3 = mod(r * (V - X3) - S1 * HHH) - const Z3 = mod(Z1 * Z2 * H) - return new JacobianPoint(X3, Y3, Z3) - } - subtract(other) { - return this.add(other.negate()) - } - multiplyUnsafe(scalar) { - const P0 = JacobianPoint.ZERO - if (typeof scalar === 'bigint' && scalar === _0n) return P0 - let n = normalizeScalar(scalar) - if (n === _1n) return this - if (!USE_ENDOMORPHISM) { - let p = P0 - let d = this - while (n > _0n) { - if (n & _1n) p = p.add(d) - d = d.double() - n >>= _1n - } - return p - } - let {k1neg, k1, k2neg, k2} = splitScalarEndo(n) - let k1p = P0 - let k2p = P0 - let d = this - while (k1 > _0n || k2 > _0n) { - if (k1 & _1n) k1p = k1p.add(d) - if (k2 & _1n) k2p = k2p.add(d) - d = d.double() - k1 >>= _1n - k2 >>= _1n - } - if (k1neg) k1p = k1p.negate() - if (k2neg) k2p = k2p.negate() - k2p = new JacobianPoint(mod(k2p.x * CURVE.beta), k2p.y, k2p.z) - return k1p.add(k2p) - } - precomputeWindow(W) { - const windows = USE_ENDOMORPHISM ? 128 / W + 1 : 256 / W + 1 - const points = [] - let p = this - let base = p - for (let window = 0; window < windows; window++) { - base = p - points.push(base) - for (let i = 1; i < 2 ** (W - 1); i++) { - base = base.add(p) - points.push(base) - } - p = base.double() - } - return points - } - wNAF(n, affinePoint) { - if (!affinePoint && this.equals(JacobianPoint.BASE)) - affinePoint = Point.BASE - const W = (affinePoint && affinePoint._WINDOW_SIZE) || 1 - if (256 % W) { - throw new Error( - 'Point#wNAF: Invalid precomputation window, must be power of 2' - ) - } - let precomputes = affinePoint && pointPrecomputes.get(affinePoint) - if (!precomputes) { - precomputes = this.precomputeWindow(W) - if (affinePoint && W !== 1) { - precomputes = JacobianPoint.normalizeZ(precomputes) - pointPrecomputes.set(affinePoint, precomputes) - } - } - let p = JacobianPoint.ZERO - let f = JacobianPoint.ZERO - const windows = 1 + (USE_ENDOMORPHISM ? 128 / W : 256 / W) - const windowSize = 2 ** (W - 1) - const mask = BigInt(2 ** W - 1) - const maxNumber = 2 ** W - const shiftBy = BigInt(W) - for (let window = 0; window < windows; window++) { - const offset = window * windowSize - let wbits = Number(n & mask) - n >>= shiftBy - if (wbits > windowSize) { - wbits -= maxNumber - n += _1n - } - if (wbits === 0) { - let pr = precomputes[offset] - if (window % 2) pr = pr.negate() - f = f.add(pr) - } else { - let cached = precomputes[offset + Math.abs(wbits) - 1] - if (wbits < 0) cached = cached.negate() - p = p.add(cached) - } - } - return {p, f} - } - multiply(scalar, affinePoint) { - let n = normalizeScalar(scalar) - let point - let fake - if (USE_ENDOMORPHISM) { - const {k1neg, k1, k2neg, k2} = splitScalarEndo(n) - let {p: k1p, f: f1p} = this.wNAF(k1, affinePoint) - let {p: k2p, f: f2p} = this.wNAF(k2, affinePoint) - if (k1neg) k1p = k1p.negate() - if (k2neg) k2p = k2p.negate() - k2p = new JacobianPoint(mod(k2p.x * CURVE.beta), k2p.y, k2p.z) - point = k1p.add(k2p) - fake = f1p.add(f2p) - } else { - const {p, f} = this.wNAF(n, affinePoint) - point = p - fake = f - } - return JacobianPoint.normalizeZ([point, fake])[0] - } - toAffine(invZ = invert(this.z)) { - const {x, y, z} = this - const iz1 = invZ - const iz2 = mod(iz1 * iz1) - const iz3 = mod(iz2 * iz1) - const ax = mod(x * iz2) - const ay = mod(y * iz3) - const zz = mod(z * iz1) - if (zz !== _1n) throw new Error('invZ was invalid') - return new Point(ax, ay) - } - } - JacobianPoint.BASE = new JacobianPoint(CURVE.Gx, CURVE.Gy, _1n) - JacobianPoint.ZERO = new JacobianPoint(_0n, _1n, _0n) - const pointPrecomputes = new WeakMap() - class Point { - constructor(x, y) { - this.x = x - this.y = y - } - _setWindowSize(windowSize) { - this._WINDOW_SIZE = windowSize - pointPrecomputes.delete(this) - } - static fromCompressedHex(bytes) { - const isShort = bytes.length === 32 - const x = bytesToNumber(isShort ? bytes : bytes.subarray(1)) - if (!isValidFieldElement(x)) throw new Error('Point is not on curve') - const y2 = weistrass(x) - let y = sqrtMod(y2) - const isYOdd = (y & _1n) === _1n - if (isShort) { - if (isYOdd) y = mod(-y) - } else { - const isFirstByteOdd = (bytes[0] & 1) === 1 - if (isFirstByteOdd !== isYOdd) y = mod(-y) - } - const point = new Point(x, y) - point.assertValidity() - return point - } - static fromUncompressedHex(bytes) { - const x = bytesToNumber(bytes.subarray(1, 33)) - const y = bytesToNumber(bytes.subarray(33, 65)) - const point = new Point(x, y) - point.assertValidity() - return point - } - static fromHex(hex) { - const bytes = ensureBytes(hex) - const len = bytes.length - const header = bytes[0] - if (len === 32 || (len === 33 && (header === 0x02 || header === 0x03))) { - return this.fromCompressedHex(bytes) - } - if (len === 65 && header === 0x04) return this.fromUncompressedHex(bytes) - throw new Error( - `Point.fromHex: received invalid point. Expected 32-33 compressed bytes or 65 uncompressed bytes, not ${len}` - ) - } - static fromPrivateKey(privateKey) { - return Point.BASE.multiply(normalizePrivateKey(privateKey)) - } - static fromSignature(msgHash, signature, recovery) { - msgHash = ensureBytes(msgHash) - const h = truncateHash(msgHash) - const {r, s} = normalizeSignature(signature) - if (recovery !== 0 && recovery !== 1) { - throw new Error('Cannot recover signature: invalid recovery bit') - } - const prefix = recovery & 1 ? '03' : '02' - const R = Point.fromHex(prefix + numTo32bStr(r)) - const {n} = CURVE - const rinv = invert(r, n) - const u1 = mod(-h * rinv, n) - const u2 = mod(s * rinv, n) - const Q = Point.BASE.multiplyAndAddUnsafe(R, u1, u2) - if (!Q) throw new Error('Cannot recover signature: point at infinify') - Q.assertValidity() - return Q - } - toRawBytes(isCompressed = false) { - return hexToBytes(this.toHex(isCompressed)) - } - toHex(isCompressed = false) { - const x = numTo32bStr(this.x) - if (isCompressed) { - const prefix = this.y & _1n ? '03' : '02' - return `${prefix}${x}` - } else { - return `04${x}${numTo32bStr(this.y)}` - } - } - toHexX() { - return this.toHex(true).slice(2) - } - toRawX() { - return this.toRawBytes(true).slice(1) - } - assertValidity() { - const msg = 'Point is not on elliptic curve' - const {x, y} = this - if (!isValidFieldElement(x) || !isValidFieldElement(y)) - throw new Error(msg) - const left = mod(y * y) - const right = weistrass(x) - if (mod(left - right) !== _0n) throw new Error(msg) - } - equals(other) { - return this.x === other.x && this.y === other.y - } - negate() { - return new Point(this.x, mod(-this.y)) - } - double() { - return JacobianPoint.fromAffine(this).double().toAffine() - } - add(other) { - return JacobianPoint.fromAffine(this) - .add(JacobianPoint.fromAffine(other)) - .toAffine() - } - subtract(other) { - return this.add(other.negate()) - } - multiply(scalar) { - return JacobianPoint.fromAffine(this).multiply(scalar, this).toAffine() - } - multiplyAndAddUnsafe(Q, a, b) { - const P = JacobianPoint.fromAffine(this) - const aP = - a === _0n || a === _1n || this !== Point.BASE - ? P.multiplyUnsafe(a) - : P.multiply(a) - const bQ = JacobianPoint.fromAffine(Q).multiplyUnsafe(b) - const sum = aP.add(bQ) - return sum.equals(JacobianPoint.ZERO) ? undefined : sum.toAffine() - } - } - Point.BASE = new Point(CURVE.Gx, CURVE.Gy) - Point.ZERO = new Point(_0n, _0n) - function sliceDER(s) { - return Number.parseInt(s[0], 16) >= 8 ? '00' + s : s - } - function parseDERInt(data) { - if (data.length < 2 || data[0] !== 0x02) { - throw new Error(`Invalid signature integer tag: ${bytesToHex(data)}`) - } - const len = data[1] - const res = data.subarray(2, len + 2) - if (!len || res.length !== len) { - throw new Error(`Invalid signature integer: wrong length`) - } - if (res[0] === 0x00 && res[1] <= 0x7f) { - throw new Error('Invalid signature integer: trailing length') - } - return {data: bytesToNumber(res), left: data.subarray(len + 2)} - } - function parseDERSignature(data) { - if (data.length < 2 || data[0] != 0x30) { - throw new Error(`Invalid signature tag: ${bytesToHex(data)}`) - } - if (data[1] !== data.length - 2) { - throw new Error('Invalid signature: incorrect length') - } - const {data: r, left: sBytes} = parseDERInt(data.subarray(2)) - const {data: s, left: rBytesLeft} = parseDERInt(sBytes) - if (rBytesLeft.length) { - throw new Error( - `Invalid signature: left bytes after parsing: ${bytesToHex(rBytesLeft)}` - ) - } - return {r, s} - } - class Signature { - constructor(r, s) { - this.r = r - this.s = s - this.assertValidity() - } - static fromCompact(hex) { - const arr = isUint8a(hex) - const name = 'Signature.fromCompact' - if (typeof hex !== 'string' && !arr) - throw new TypeError(`${name}: Expected string or Uint8Array`) - const str = arr ? bytesToHex(hex) : hex - if (str.length !== 128) throw new Error(`${name}: Expected 64-byte hex`) - return new Signature( - hexToNumber(str.slice(0, 64)), - hexToNumber(str.slice(64, 128)) - ) - } - static fromDER(hex) { - const arr = isUint8a(hex) - if (typeof hex !== 'string' && !arr) - throw new TypeError(`Signature.fromDER: Expected string or Uint8Array`) - const {r, s} = parseDERSignature(arr ? hex : hexToBytes(hex)) - return new Signature(r, s) - } - static fromHex(hex) { - return this.fromDER(hex) - } - assertValidity() { - const {r, s} = this - if (!isWithinCurveOrder(r)) - throw new Error('Invalid Signature: r must be 0 < r < n') - if (!isWithinCurveOrder(s)) - throw new Error('Invalid Signature: s must be 0 < s < n') - } - hasHighS() { - const HALF = CURVE.n >> _1n - return this.s > HALF - } - normalizeS() { - return this.hasHighS() ? new Signature(this.r, CURVE.n - this.s) : this - } - toDERRawBytes(isCompressed = false) { - return hexToBytes(this.toDERHex(isCompressed)) - } - toDERHex(isCompressed = false) { - const sHex = sliceDER(numberToHexUnpadded(this.s)) - if (isCompressed) return sHex - const rHex = sliceDER(numberToHexUnpadded(this.r)) - const rLen = numberToHexUnpadded(rHex.length / 2) - const sLen = numberToHexUnpadded(sHex.length / 2) - const length = numberToHexUnpadded(rHex.length / 2 + sHex.length / 2 + 4) - return `30${length}02${rLen}${rHex}02${sLen}${sHex}` - } - toRawBytes() { - return this.toDERRawBytes() - } - toHex() { - return this.toDERHex() - } - toCompactRawBytes() { - return hexToBytes(this.toCompactHex()) - } - toCompactHex() { - return numTo32bStr(this.r) + numTo32bStr(this.s) - } - } - function concatBytes(...arrays) { - if (!arrays.every(isUint8a)) throw new Error('Uint8Array list expected') - if (arrays.length === 1) return arrays[0] - const length = arrays.reduce((a, arr) => a + arr.length, 0) - const result = new Uint8Array(length) - for (let i = 0, pad = 0; i < arrays.length; i++) { - const arr = arrays[i] - result.set(arr, pad) - pad += arr.length - } - return result - } - function isUint8a(bytes) { - return bytes instanceof Uint8Array - } - const hexes = Array.from({length: 256}, (v, i) => - i.toString(16).padStart(2, '0') - ) - function bytesToHex(uint8a) { - if (!(uint8a instanceof Uint8Array)) throw new Error('Expected Uint8Array') - let hex = '' - for (let i = 0; i < uint8a.length; i++) { - hex += hexes[uint8a[i]] - } - return hex - } - function numTo32bStr(num) { - if (num > POW_2_256) throw new Error('Expected number < 2^256') - return num.toString(16).padStart(64, '0') - } - function numTo32b(num) { - return hexToBytes(numTo32bStr(num)) - } - function numberToHexUnpadded(num) { - const hex = num.toString(16) - return hex.length & 1 ? `0${hex}` : hex - } - function hexToNumber(hex) { - if (typeof hex !== 'string') { - throw new TypeError('hexToNumber: expected string, got ' + typeof hex) - } - return BigInt(`0x${hex}`) - } - function hexToBytes(hex) { - if (typeof hex !== 'string') { - throw new TypeError('hexToBytes: expected string, got ' + typeof hex) - } - if (hex.length % 2) - throw new Error('hexToBytes: received invalid unpadded hex' + hex.length) - const array = new Uint8Array(hex.length / 2) - for (let i = 0; i < array.length; i++) { - const j = i * 2 - const hexByte = hex.slice(j, j + 2) - const byte = Number.parseInt(hexByte, 16) - if (Number.isNaN(byte) || byte < 0) - throw new Error('Invalid byte sequence') - array[i] = byte - } - return array - } - function bytesToNumber(bytes) { - return hexToNumber(bytesToHex(bytes)) - } - function ensureBytes(hex) { - return hex instanceof Uint8Array ? Uint8Array.from(hex) : hexToBytes(hex) - } - function normalizeScalar(num) { - if (typeof num === 'number' && Number.isSafeInteger(num) && num > 0) - return BigInt(num) - if (typeof num === 'bigint' && isWithinCurveOrder(num)) return num - throw new TypeError('Expected valid private scalar: 0 < scalar < curve.n') - } - function mod(a, b = CURVE.P) { - const result = a % b - return result >= _0n ? result : b + result - } - function pow2(x, power) { - const {P} = CURVE - let res = x - while (power-- > _0n) { - res *= res - res %= P - } - return res - } - function sqrtMod(x) { - const {P} = CURVE - const _6n = BigInt(6) - const _11n = BigInt(11) - const _22n = BigInt(22) - const _23n = BigInt(23) - const _44n = BigInt(44) - const _88n = BigInt(88) - const b2 = (x * x * x) % P - const b3 = (b2 * b2 * x) % P - const b6 = (pow2(b3, _3n) * b3) % P - const b9 = (pow2(b6, _3n) * b3) % P - const b11 = (pow2(b9, _2n) * b2) % P - const b22 = (pow2(b11, _11n) * b11) % P - const b44 = (pow2(b22, _22n) * b22) % P - const b88 = (pow2(b44, _44n) * b44) % P - const b176 = (pow2(b88, _88n) * b88) % P - const b220 = (pow2(b176, _44n) * b44) % P - const b223 = (pow2(b220, _3n) * b3) % P - const t1 = (pow2(b223, _23n) * b22) % P - const t2 = (pow2(t1, _6n) * b2) % P - return pow2(t2, _2n) - } - function invert(number, modulo = CURVE.P) { - if (number === _0n || modulo <= _0n) { - throw new Error( - `invert: expected positive integers, got n=${number} mod=${modulo}` - ) - } - let a = mod(number, modulo) - let b = modulo - let x = _0n, - u = _1n - while (a !== _0n) { - const q = b / a - const r = b % a - const m = x - u * q - ;(b = a), (a = r), (x = u), (u = m) - } - const gcd = b - if (gcd !== _1n) throw new Error('invert: does not exist') - return mod(x, modulo) - } - function invertBatch(nums, p = CURVE.P) { - const scratch = new Array(nums.length) - const lastMultiplied = nums.reduce((acc, num, i) => { - if (num === _0n) return acc - scratch[i] = acc - return mod(acc * num, p) - }, _1n) - const inverted = invert(lastMultiplied, p) - nums.reduceRight((acc, num, i) => { - if (num === _0n) return acc - scratch[i] = mod(acc * scratch[i], p) - return mod(acc * num, p) - }, inverted) - return scratch - } - const divNearest = (a, b) => (a + b / _2n) / b - const POW_2_128 = _2n ** BigInt(128) - function splitScalarEndo(k) { - const {n} = CURVE - const a1 = BigInt('0x3086d221a7d46bcde86c90e49284eb15') - const b1 = -_1n * BigInt('0xe4437ed6010e88286f547fa90abfe4c3') - const a2 = BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8') - const b2 = a1 - const c1 = divNearest(b2 * k, n) - const c2 = divNearest(-b1 * k, n) - let k1 = mod(k - c1 * a1 - c2 * a2, n) - let k2 = mod(-c1 * b1 - c2 * b2, n) - const k1neg = k1 > POW_2_128 - const k2neg = k2 > POW_2_128 - if (k1neg) k1 = n - k1 - if (k2neg) k2 = n - k2 - if (k1 > POW_2_128 || k2 > POW_2_128) { - throw new Error('splitScalarEndo: Endomorphism failed, k=' + k) - } - return {k1neg, k1, k2neg, k2} - } - function truncateHash(hash) { - const {n} = CURVE - const byteLength = hash.length - const delta = byteLength * 8 - 256 - let h = bytesToNumber(hash) - if (delta > 0) h = h >> BigInt(delta) - if (h >= n) h -= n - return h - } - class HmacDrbg { - constructor() { - this.v = new Uint8Array(32).fill(1) - this.k = new Uint8Array(32).fill(0) - this.counter = 0 - } - hmac(...values) { - return utils.hmacSha256(this.k, ...values) - } - hmacSync(...values) { - if (typeof utils.hmacSha256Sync !== 'function') - throw new Error('utils.hmacSha256Sync is undefined, you need to set it') - const res = utils.hmacSha256Sync(this.k, ...values) - if (res instanceof Promise) - throw new Error('To use sync sign(), ensure utils.hmacSha256 is sync') - return res - } - incr() { - if (this.counter >= 1000) { - throw new Error('Tried 1,000 k values for sign(), all were invalid') - } - this.counter += 1 - } - async reseed(seed = new Uint8Array()) { - this.k = await this.hmac(this.v, Uint8Array.from([0x00]), seed) - this.v = await this.hmac(this.v) - if (seed.length === 0) return - this.k = await this.hmac(this.v, Uint8Array.from([0x01]), seed) - this.v = await this.hmac(this.v) - } - reseedSync(seed = new Uint8Array()) { - this.k = this.hmacSync(this.v, Uint8Array.from([0x00]), seed) - this.v = this.hmacSync(this.v) - if (seed.length === 0) return - this.k = this.hmacSync(this.v, Uint8Array.from([0x01]), seed) - this.v = this.hmacSync(this.v) - } - async generate() { - this.incr() - this.v = await this.hmac(this.v) - return this.v - } - generateSync() { - this.incr() - this.v = this.hmacSync(this.v) - return this.v - } - } - function isWithinCurveOrder(num) { - return _0n < num && num < CURVE.n - } - function isValidFieldElement(num) { - return _0n < num && num < CURVE.P - } - function kmdToSig(kBytes, m, d) { - const k = bytesToNumber(kBytes) - if (!isWithinCurveOrder(k)) return - const {n} = CURVE - const q = Point.BASE.multiply(k) - const r = mod(q.x, n) - if (r === _0n) return - const s = mod(invert(k, n) * mod(m + d * r, n), n) - if (s === _0n) return - const sig = new Signature(r, s) - const recovery = (q.x === sig.r ? 0 : 2) | Number(q.y & _1n) - return {sig, recovery} - } - function normalizePrivateKey(key) { - let num - if (typeof key === 'bigint') { - num = key - } else if ( - typeof key === 'number' && - Number.isSafeInteger(key) && - key > 0 - ) { - num = BigInt(key) - } else if (typeof key === 'string') { - if (key.length !== 64) throw new Error('Expected 32 bytes of private key') - num = hexToNumber(key) - } else if (isUint8a(key)) { - if (key.length !== 32) throw new Error('Expected 32 bytes of private key') - num = bytesToNumber(key) - } else { - throw new TypeError('Expected valid private key') - } - if (!isWithinCurveOrder(num)) - throw new Error('Expected private key: 0 < key < n') - return num - } - function normalizePublicKey(publicKey) { - if (publicKey instanceof Point) { - publicKey.assertValidity() - return publicKey - } else { - return Point.fromHex(publicKey) - } - } - function normalizeSignature(signature) { - if (signature instanceof Signature) { - signature.assertValidity() - return signature - } - try { - return Signature.fromDER(signature) - } catch (error) { - return Signature.fromCompact(signature) - } - } - function getPublicKey(privateKey, isCompressed = false) { - return Point.fromPrivateKey(privateKey).toRawBytes(isCompressed) - } - function recoverPublicKey( - msgHash, - signature, - recovery, - isCompressed = false - ) { - return Point.fromSignature(msgHash, signature, recovery).toRawBytes( - isCompressed - ) - } - function isPub(item) { - const arr = isUint8a(item) - const str = typeof item === 'string' - const len = (arr || str) && item.length - if (arr) return len === 33 || len === 65 - if (str) return len === 66 || len === 130 - if (item instanceof Point) return true - return false - } - function getSharedSecret(privateA, publicB, isCompressed = false) { - if (isPub(privateA)) - throw new TypeError('getSharedSecret: first arg must be private key') - if (!isPub(publicB)) - throw new TypeError('getSharedSecret: second arg must be public key') - const b = normalizePublicKey(publicB) - b.assertValidity() - return b.multiply(normalizePrivateKey(privateA)).toRawBytes(isCompressed) - } - function bits2int(bytes) { - const slice = bytes.length > 32 ? bytes.slice(0, 32) : bytes - return bytesToNumber(slice) - } - function bits2octets(bytes) { - const z1 = bits2int(bytes) - const z2 = mod(z1, CURVE.n) - return int2octets(z2 < _0n ? z1 : z2) - } - function int2octets(num) { - if (typeof num !== 'bigint') throw new Error('Expected bigint') - const hex = numTo32bStr(num) - return hexToBytes(hex) - } - function initSigArgs(msgHash, privateKey, extraEntropy) { - if (msgHash == null) - throw new Error(`sign: expected valid message hash, not "${msgHash}"`) - const h1 = ensureBytes(msgHash) - const d = normalizePrivateKey(privateKey) - const seedArgs = [int2octets(d), bits2octets(h1)] - if (extraEntropy != null) { - if (extraEntropy === true) extraEntropy = utils.randomBytes(32) - const e = ensureBytes(extraEntropy) - if (e.length !== 32) - throw new Error('sign: Expected 32 bytes of extra data') - seedArgs.push(e) - } - const seed = concatBytes(...seedArgs) - const m = bits2int(h1) - return {seed, m, d} - } - function finalizeSig(recSig, opts) { - let {sig, recovery} = recSig - const {canonical, der, recovered} = Object.assign( - {canonical: true, der: true}, - opts - ) - if (canonical && sig.hasHighS()) { - sig = sig.normalizeS() - recovery ^= 1 - } - const hashed = der ? sig.toDERRawBytes() : sig.toCompactRawBytes() - return recovered ? [hashed, recovery] : hashed - } - async function sign(msgHash, privKey, opts = {}) { - const {seed, m, d} = initSigArgs(msgHash, privKey, opts.extraEntropy) - let sig - const drbg = new HmacDrbg() - await drbg.reseed(seed) - while (!(sig = kmdToSig(await drbg.generate(), m, d))) await drbg.reseed() - return finalizeSig(sig, opts) - } - function signSync(msgHash, privKey, opts = {}) { - const {seed, m, d} = initSigArgs(msgHash, privKey, opts.extraEntropy) - let sig - const drbg = new HmacDrbg() - drbg.reseedSync(seed) - while (!(sig = kmdToSig(drbg.generateSync(), m, d))) drbg.reseedSync() - return finalizeSig(sig, opts) - } - const vopts = {strict: true} - function verify(signature, msgHash, publicKey, opts = vopts) { - let sig - try { - sig = normalizeSignature(signature) - msgHash = ensureBytes(msgHash) - } catch (error) { - return false - } - const {r, s} = sig - if (opts.strict && sig.hasHighS()) return false - const h = truncateHash(msgHash) - let P - try { - P = normalizePublicKey(publicKey) - } catch (error) { - return false - } - const {n} = CURVE - const sinv = invert(s, n) - const u1 = mod(h * sinv, n) - const u2 = mod(r * sinv, n) - const R = Point.BASE.multiplyAndAddUnsafe(P, u1, u2) - if (!R) return false - const v = mod(R.x, n) - return v === r - } - function finalizeSchnorrChallenge(ch) { - return mod(bytesToNumber(ch), CURVE.n) - } - function hasEvenY(point) { - return (point.y & _1n) === _0n - } - class SchnorrSignature { - constructor(r, s) { - this.r = r - this.s = s - this.assertValidity() - } - static fromHex(hex) { - const bytes = ensureBytes(hex) - if (bytes.length !== 64) - throw new TypeError( - `SchnorrSignature.fromHex: expected 64 bytes, not ${bytes.length}` - ) - const r = bytesToNumber(bytes.subarray(0, 32)) - const s = bytesToNumber(bytes.subarray(32, 64)) - return new SchnorrSignature(r, s) - } - assertValidity() { - const {r, s} = this - if (!isValidFieldElement(r) || !isWithinCurveOrder(s)) - throw new Error('Invalid signature') - } - toHex() { - return numTo32bStr(this.r) + numTo32bStr(this.s) - } - toRawBytes() { - return hexToBytes(this.toHex()) - } - } - function schnorrGetPublicKey(privateKey) { - return Point.fromPrivateKey(privateKey).toRawX() - } - function initSchnorrSigArgs(message, privateKey, auxRand) { - if (message == null) - throw new TypeError(`sign: Expected valid message, not "${message}"`) - const m = ensureBytes(message) - const d0 = normalizePrivateKey(privateKey) - const rand = ensureBytes(auxRand) - if (rand.length !== 32) - throw new TypeError('sign: Expected 32 bytes of aux randomness') - const P = Point.fromPrivateKey(d0) - const px = P.toRawX() - const d = hasEvenY(P) ? d0 : CURVE.n - d0 - return {m, P, px, d, rand} - } - function initSchnorrNonce(d, t0h) { - return numTo32b(d ^ bytesToNumber(t0h)) - } - function finalizeSchnorrNonce(k0h) { - const k0 = mod(bytesToNumber(k0h), CURVE.n) - if (k0 === _0n) - throw new Error('sign: Creation of signature failed. k is zero') - const R = Point.fromPrivateKey(k0) - const rx = R.toRawX() - const k = hasEvenY(R) ? k0 : CURVE.n - k0 - return {R, rx, k} - } - function finalizeSchnorrSig(R, k, e, d) { - return new SchnorrSignature(R.x, mod(k + e * d, CURVE.n)).toRawBytes() - } - async function schnorrSign( - message, - privateKey, - auxRand = utils.randomBytes() - ) { - const {m, px, d, rand} = initSchnorrSigArgs(message, privateKey, auxRand) - const t = initSchnorrNonce(d, await utils.taggedHash(TAGS.aux, rand)) - const {R, rx, k} = finalizeSchnorrNonce( - await utils.taggedHash(TAGS.nonce, t, px, m) - ) - const e = finalizeSchnorrChallenge( - await utils.taggedHash(TAGS.challenge, rx, px, m) - ) - const sig = finalizeSchnorrSig(R, k, e, d) - const isValid = await schnorrVerify(sig, m, px) - if (!isValid) throw new Error('sign: Invalid signature produced') - return sig - } - function schnorrSignSync(message, privateKey, auxRand = utils.randomBytes()) { - const {m, px, d, rand} = initSchnorrSigArgs(message, privateKey, auxRand) - const t = initSchnorrNonce(d, utils.taggedHashSync(TAGS.aux, rand)) - const {R, rx, k} = finalizeSchnorrNonce( - utils.taggedHashSync(TAGS.nonce, t, px, m) - ) - const e = finalizeSchnorrChallenge( - utils.taggedHashSync(TAGS.challenge, rx, px, m) - ) - const sig = finalizeSchnorrSig(R, k, e, d) - const isValid = schnorrVerifySync(sig, m, px) - if (!isValid) throw new Error('sign: Invalid signature produced') - return sig - } - function initSchnorrVerify(signature, message, publicKey) { - const raw = signature instanceof SchnorrSignature - const sig = raw ? signature : SchnorrSignature.fromHex(signature) - if (raw) sig.assertValidity() - return { - ...sig, - m: ensureBytes(message), - P: normalizePublicKey(publicKey) - } - } - function finalizeSchnorrVerify(r, P, s, e) { - const R = Point.BASE.multiplyAndAddUnsafe( - P, - normalizePrivateKey(s), - mod(-e, CURVE.n) - ) - if (!R || !hasEvenY(R) || R.x !== r) return false - return true - } - async function schnorrVerify(signature, message, publicKey) { - try { - const {r, s, m, P} = initSchnorrVerify(signature, message, publicKey) - const e = finalizeSchnorrChallenge( - await utils.taggedHash(TAGS.challenge, numTo32b(r), P.toRawX(), m) - ) - return finalizeSchnorrVerify(r, P, s, e) - } catch (error) { - return false - } - } - function schnorrVerifySync(signature, message, publicKey) { - try { - const {r, s, m, P} = initSchnorrVerify(signature, message, publicKey) - const e = finalizeSchnorrChallenge( - utils.taggedHashSync(TAGS.challenge, numTo32b(r), P.toRawX(), m) - ) - return finalizeSchnorrVerify(r, P, s, e) - } catch (error) { - return false - } - } - const schnorr = { - Signature: SchnorrSignature, - getPublicKey: schnorrGetPublicKey, - sign: schnorrSign, - verify: schnorrVerify, - signSync: schnorrSignSync, - verifySync: schnorrVerifySync - } - Point.BASE._setWindowSize(8) - const crypto = { - node: nodeCrypto, - web: typeof self === 'object' && 'crypto' in self ? self.crypto : undefined - } - const TAGS = { - challenge: 'BIP0340/challenge', - aux: 'BIP0340/aux', - nonce: 'BIP0340/nonce' - } - const TAGGED_HASH_PREFIXES = {} - const utils = { - isValidPrivateKey(privateKey) { - try { - normalizePrivateKey(privateKey) - return true - } catch (error) { - return false - } - }, - privateAdd: (privateKey, tweak) => { - const p = normalizePrivateKey(privateKey) - const t = normalizePrivateKey(tweak) - return numTo32b(mod(p + t, CURVE.n)) - }, - privateNegate: privateKey => { - const p = normalizePrivateKey(privateKey) - return numTo32b(CURVE.n - p) - }, - pointAddScalar: (p, tweak, isCompressed) => { - const P = Point.fromHex(p) - const t = normalizePrivateKey(tweak) - const Q = Point.BASE.multiplyAndAddUnsafe(P, t, _1n) - if (!Q) throw new Error('Tweaked point at infinity') - return Q.toRawBytes(isCompressed) - }, - pointMultiply: (p, tweak, isCompressed) => { - const P = Point.fromHex(p) - const t = bytesToNumber(ensureBytes(tweak)) - return P.multiply(t).toRawBytes(isCompressed) - }, - hashToPrivateKey: hash => { - hash = ensureBytes(hash) - if (hash.length < 40 || hash.length > 1024) - throw new Error('Expected 40-1024 bytes of private key as per FIPS 186') - const num = mod(bytesToNumber(hash), CURVE.n - _1n) + _1n - return numTo32b(num) - }, - randomBytes: (bytesLength = 32) => { - if (crypto.web) { - return crypto.web.getRandomValues(new Uint8Array(bytesLength)) - } else if (crypto.node) { - const {randomBytes} = crypto.node - return Uint8Array.from(randomBytes(bytesLength)) - } else { - throw new Error("The environment doesn't have randomBytes function") - } - }, - randomPrivateKey: () => { - return utils.hashToPrivateKey(utils.randomBytes(40)) - }, - bytesToHex, - hexToBytes, - concatBytes, - mod, - invert, - sha256: async (...messages) => { - if (crypto.web) { - const buffer = await crypto.web.subtle.digest( - 'SHA-256', - concatBytes(...messages) - ) - return new Uint8Array(buffer) - } else if (crypto.node) { - const {createHash} = crypto.node - const hash = createHash('sha256') - messages.forEach(m => hash.update(m)) - return Uint8Array.from(hash.digest()) - } else { - throw new Error("The environment doesn't have sha256 function") - } - }, - hmacSha256: async (key, ...messages) => { - if (crypto.web) { - const ckey = await crypto.web.subtle.importKey( - 'raw', - key, - {name: 'HMAC', hash: {name: 'SHA-256'}}, - false, - ['sign'] - ) - const message = concatBytes(...messages) - const buffer = await crypto.web.subtle.sign('HMAC', ckey, message) - return new Uint8Array(buffer) - } else if (crypto.node) { - const {createHmac} = crypto.node - const hash = createHmac('sha256', key) - messages.forEach(m => hash.update(m)) - return Uint8Array.from(hash.digest()) - } else { - throw new Error("The environment doesn't have hmac-sha256 function") - } - }, - sha256Sync: undefined, - hmacSha256Sync: undefined, - taggedHash: async (tag, ...messages) => { - let tagP = TAGGED_HASH_PREFIXES[tag] - if (tagP === undefined) { - const tagH = await utils.sha256( - Uint8Array.from(tag, c => c.charCodeAt(0)) - ) - tagP = concatBytes(tagH, tagH) - TAGGED_HASH_PREFIXES[tag] = tagP - } - return utils.sha256(tagP, ...messages) - }, - taggedHashSync: (tag, ...messages) => { - if (typeof utils.sha256Sync !== 'function') - throw new Error('utils.sha256Sync is undefined, you need to set it') - let tagP = TAGGED_HASH_PREFIXES[tag] - if (tagP === undefined) { - const tagH = utils.sha256Sync( - Uint8Array.from(tag, c => c.charCodeAt(0)) - ) - tagP = concatBytes(tagH, tagH) - TAGGED_HASH_PREFIXES[tag] = tagP - } - return utils.sha256Sync(tagP, ...messages) - }, - precompute(windowSize = 8, point = Point.BASE) { - const cached = point === Point.BASE ? point : new Point(point.x, point.y) - cached._setWindowSize(windowSize) - cached.multiply(_3n) - return cached - } - } - - exports.CURVE = CURVE - exports.Point = Point - exports.Signature = Signature - exports.getPublicKey = getPublicKey - exports.getSharedSecret = getSharedSecret - exports.recoverPublicKey = recoverPublicKey - exports.schnorr = schnorr - exports.sign = sign - exports.signSync = signSync - exports.utils = utils - exports.verify = verify - - Object.defineProperty(exports, '__esModule', {value: true}) -}) diff --git a/lnbits/extensions/cashu/static/js/utils.js b/lnbits/extensions/cashu/static/js/utils.js deleted file mode 100644 index cf852b58..00000000 --- a/lnbits/extensions/cashu/static/js/utils.js +++ /dev/null @@ -1,23 +0,0 @@ -function splitAmount(value) { - const chunks = [] - for (let i = 0; i < 32; i++) { - const mask = 1 << i - if ((value & mask) !== 0) chunks.push(Math.pow(2, i)) - } - return chunks -} - -function bytesToNumber(bytes) { - return hexToNumber(nobleSecp256k1.utils.bytesToHex(bytes)) -} - -function bigIntStringify(key, value) { - return typeof value === 'bigint' ? value.toString() : value -} - -function hexToNumber(hex) { - if (typeof hex !== 'string') { - throw new TypeError('hexToNumber: expected string, got ' + typeof hex) - } - return BigInt(`0x${hex}`) -} diff --git a/lnbits/extensions/cashu/tasks.py b/lnbits/extensions/cashu/tasks.py deleted file mode 100644 index 9de17a1c..00000000 --- a/lnbits/extensions/cashu/tasks.py +++ /dev/null @@ -1,33 +0,0 @@ -import asyncio -import json - -from cashu.core.migrations import migrate_databases -from cashu.mint import migrations - -from lnbits.core.models import Payment -from lnbits.tasks import register_invoice_listener - -from . import db, ledger -from .crud import get_cashu - - -async def startup_cashu_mint(): - await migrate_databases(db, migrations) - await ledger.load_used_proofs() - await ledger.init_keysets(autosave=False) - pass - - -async def wait_for_paid_invoices(): - invoice_queue = asyncio.Queue() - register_invoice_listener(invoice_queue) - - while True: - payment = await invoice_queue.get() - await on_invoice_paid(payment) - - -async def on_invoice_paid(payment: Payment) -> None: - if payment.extra and not payment.extra.get("tag") == "cashu": - return - return diff --git a/lnbits/extensions/cashu/templates/cashu/_api_docs.html b/lnbits/extensions/cashu/templates/cashu/_api_docs.html deleted file mode 100644 index f7bb19f6..00000000 --- a/lnbits/extensions/cashu/templates/cashu/_api_docs.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - diff --git a/lnbits/extensions/cashu/templates/cashu/_cashu.html b/lnbits/extensions/cashu/templates/cashu/_cashu.html deleted file mode 100644 index 952fe7e1..00000000 --- a/lnbits/extensions/cashu/templates/cashu/_cashu.html +++ /dev/null @@ -1,13 +0,0 @@ - - - -

Create Cashu ecash mints and wallets.

- Created by - arcbtc, - vlad, - calle. -
-
-
diff --git a/lnbits/extensions/cashu/templates/cashu/index.html b/lnbits/extensions/cashu/templates/cashu/index.html deleted file mode 100644 index 2599669c..00000000 --- a/lnbits/extensions/cashu/templates/cashu/index.html +++ /dev/null @@ -1,367 +0,0 @@ -{% extends "base.html" %} {% from "macros.jinja" import window_vars with context -%} {% block page %} -
-
- - - Cashu mint and wallet -

-

- Here you can create multiple cashu mints that you can share. Each mint - can service many users but all ecash tokens of a mint are only valid - inside that mint and not across different mints. To exchange funds - between mints, use Lightning payments. -

- Important -

-

- If you are the operator of this LNbits instance, make sure to set - CASHU_PRIVATE_KEY="randomkey" in your configuration file. Do not - create mints before setting the key and do not change the key once - set. -

-
-
- - - -
-
-
Mints
-
-
- Export to CSV -
-
- - {% raw %} - - - - {% endraw %} - - New Mint -
-
-
- -
- - -
{{SITE_TITLE}} Cashu extension
-
- - - - {% include "cashu/_api_docs.html" %} - - {% include "cashu/_cashu.html" %} - - -
-
- - - - - - - -
- Create Mint - - Cancel -
-
-
-
-
-{% endblock %} {% block scripts %} {{ window_vars(user) }} - -{% endblock %} diff --git a/lnbits/extensions/cashu/templates/cashu/mint.html b/lnbits/extensions/cashu/templates/cashu/mint.html deleted file mode 100644 index ee6ab606..00000000 --- a/lnbits/extensions/cashu/templates/cashu/mint.html +++ /dev/null @@ -1,76 +0,0 @@ -{% extends "public.html" %} {% block page %} -
-
- - -
- -

{{ mint_name }}

- Open wallet -
-
-
- - -
Read the following carefully!
-

- This is a - Cashu - mint. Cashu is an ecash system for Bitcoin. -

-

- Open this page in your native browser
- Before you continue to the wallet, make sure to open this page in your - device's native browser application (Safari for iOS, Chrome for - Android). Do not use Cashu in an embedded browser that opens when you - click a link in a messenger. -

-

- Add wallet to home screen
- You can add Cashu to your home screen as a progressive web app (PWA). - After opening the wallet in your browser (click the link above), on - Android (Chrome), click the menu at the upper right. On iOS (Safari), - click the share button. Now press the Add to Home screen button. -

-

- Backup your wallet
- Ecash is a bearer asset. That means losing access to your wallet will - make you lose your funds. The wallet stores ecash tokens on your - device's database. If you lose the link or delete your your data - without backing up, you will lose your tokens. Press the Backup button - in the wallet to download a copy of your tokens. -

-

- This service is in BETA
- We hold no responsibility for people losing access to funds. Use at - your own risk! -

-
-
-
- - {% endblock %} {% block scripts %} - - - - {% endblock %} -
diff --git a/lnbits/extensions/cashu/templates/cashu/wallet.html b/lnbits/extensions/cashu/templates/cashu/wallet.html deleted file mode 100644 index a133f592..00000000 --- a/lnbits/extensions/cashu/templates/cashu/wallet.html +++ /dev/null @@ -1,2337 +0,0 @@ -{% extends "public.html" %} {% block toolbar_title %} {% raw %} {{name}} Cashu -{% endraw %} {% endblock %} {% block footer %}{% endblock %} {% block -page_container %} - - -
-
- - -
-
-
- Get invoice - -
-
-

-
- {% raw %} {{getBalance()}} - {{tickershort}}{% endraw %} -
-

-
-
- Pay invoice - -
-
-
-
-
-
-

-
- {% raw %} {{getBalance()}} - {{tickershort}}{% endraw %} -
-

-
-
-
-
-
- - - -
-
- Get Ecash -
-
-
- - Pay Ecash -
-
- - - - - - - - - - - - - {% raw %} - - {% endraw %} - - - - - - - - {% raw %} - - {% endraw %} - - - - - - - - {% raw %} - - {% endraw %} - - - -
-
- -
- - Warning - BackupDownload wallet backup -
-
- - - - - - - - - - - - -
-
- {% raw %} {{ - parseFloat(String(payInvoiceData.invoice.fsat).replaceAll(",", - "")) / 100 }} {% endraw %} {{LNBITS_DENOMINATION}} {% raw %} -
-
- {{ payInvoiceData.invoice.fsat }}{% endraw %} - {{LNBITS_DENOMINATION}} {% raw %} -
- -

- Description: {{ - payInvoiceData.invoice.description }}
- Expire date: {{ payInvoiceData.invoice.expireDate - }}
- Hash: {{ payInvoiceData.invoice.hash }} -

- {% endraw %} -
- Pay - Cancel -
-
- Not enough funds! - Cancel -
-
-
- {% raw %} - -

- Authenticate with {{ payInvoiceData.lnurlauth.domain }}? -

- -

- For every website and for every LNbits wallet, a new keypair - will be deterministically generated so your identity can't be - tied to your LNbits wallet or linked across websites. No other - data will be shared with {{ payInvoiceData.lnurlauth.domain }}. -

-

- Your public key for - {{ payInvoiceData.lnurlauth.domain }} is: -

-

- - {{ payInvoiceData.lnurlauth.pubkey }} - -

-
- Login - Cancel -
-
- {% endraw %} -
-
- {% raw %} - -

- {{ payInvoiceData.lnurlpay.domain }} is requesting {{ - payInvoiceData.lnurlpay.maxSendable | msatoshiFormat }} - {{LNBITS_DENOMINATION}} - -
- and a {{payInvoiceData.lnurlpay.commentAllowed}}-char comment -
-

-

- {{ payInvoiceData.lnurlpay.targetUser || - payInvoiceData.lnurlpay.domain }} - is requesting
- between - {{ payInvoiceData.lnurlpay.minSendable | msatoshiFormat }} - and - {{ payInvoiceData.lnurlpay.maxSendable | msatoshiFormat }} - {% endraw %} {{LNBITS_DENOMINATION}} {% raw %} - -
- and a {{payInvoiceData.lnurlpay.commentAllowed}}-char comment -
-

- -
-

- {{ payInvoiceData.lnurlpay.description }} -

-

- -

-
-
-
- {% endraw %} - - {% raw %} -
-
- -
-
-
- Send {{LNBITS_DENOMINATION}} - Cancel -
-
- {% endraw %} -
-
- - - -
- Enter - - - Close -
-
-
- - - -
- - Cancel - -
-
-
-
-
- - - -
- -
-
- Cancel -
-
-
- - - -
Warning
-

- Bookmark this page and backup your tokens! - Ecash is a bearer asset, meaning losing access to this wallet will - mean you will lose the funds. This wallet stores ecash tokens in its - database. If you lose the link or delete your your data without - backing up, you will lose your tokens. Press the Backup button to - download a copy of your tokens. -

-

- Add to home screen. - You can add Cashu to your home screen as a progressive web app - (PWA). On Android Chrome, click the hamburger menu at the upper - right. On iOS Safari, click the share button. Now press the Add to - Home screen button. -

-

- This service is in BETA! We hold no responsibility - for people losing access to funds. Use at your own risk! -

-
- Copy wallet URL - I understand -
-
-
- - - -
-
-
- Create a Lightning invoice -
-
- - -
- -
- Copy invoice - Create Invoice - Close -
-
-
- - - -
-
-
- How much would you like to send? -
-
- - -
-
-
- - - - - - -
- -
-
- Send Tokens - -
- Copy token - Copy link -
- - Close -
-
-
- - - -
-
-
- Receive Cashu tokens -
-
- -
- -
- Receive Tokens - - Close -
-
-
-
-
-
-{% endblock %} {% block styles %} - -{% endblock %} {% block scripts %} - - - - - -{% endblock %} diff --git a/lnbits/extensions/cashu/views.py b/lnbits/extensions/cashu/views.py deleted file mode 100644 index 0de791c4..00000000 --- a/lnbits/extensions/cashu/views.py +++ /dev/null @@ -1,224 +0,0 @@ -from http import HTTPStatus - -from fastapi import Request -from fastapi.params import Depends -from fastapi.templating import Jinja2Templates -from starlette.exceptions import HTTPException -from starlette.responses import HTMLResponse - -from lnbits.core.models import User -from lnbits.decorators import check_user_exists - -from . import cashu_ext, cashu_renderer -from .crud import get_cashu - -templates = Jinja2Templates(directory="templates") - - -@cashu_ext.get("/", response_class=HTMLResponse) -async def index( - request: Request, - user: User = Depends(check_user_exists), # type: ignore -): - return cashu_renderer().TemplateResponse( - "cashu/index.html", {"request": request, "user": user.dict()} - ) - - -@cashu_ext.get("/wallet") -async def wallet(request: Request, mint_id: str): - return cashu_renderer().TemplateResponse( - "cashu/wallet.html", - { - "request": request, - "web_manifest": f"/cashu/manifest/{mint_id}.webmanifest", - }, - ) - - -@cashu_ext.get("/mint/{mintID}") -async def cashu(request: Request, mintID): - cashu = await get_cashu(mintID) - if not cashu: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="TPoS does not exist." - ) - return cashu_renderer().TemplateResponse( - "cashu/mint.html", - {"request": request, "mint_name": cashu.name, "mint_id": mintID}, - ) - - -@cashu_ext.get("/manifest/{cashu_id}.webmanifest") -async def manifest(cashu_id: str): - cashu = await get_cashu(cashu_id) - if not cashu: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="TPoS does not exist." - ) - - return { - "short_name": "Cashu", - "name": "Cashu" + " - " + cashu.name, - "icons": [ - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/android/android-launchericon-512-512.png", - "type": "image/png", - "sizes": "512x512", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/android/android-launchericon-96-96.png", - "type": "image/png", - "sizes": "96x96", - }, - ], - "id": "/cashu/wallet?mint_id=" + cashu_id, - "start_url": "/cashu/wallet?mint_id=" + cashu_id, - "background_color": "#1F2234", - "description": "Cashu ecash wallet", - "display": "standalone", - "scope": "/cashu/", - "theme_color": "#1F2234", - "protocol_handlers": [ - {"protocol": "cashu", "url": "&recv_token=%s"}, - {"protocol": "lightning", "url": "&lightning=%s"}, - ], - "shortcuts": [ - { - "name": "Cashu" + " - " + cashu.name, - "short_name": "Cashu", - "description": "Cashu" + " - " + cashu.name, - "url": "/cashu/wallet?mint_id=" + cashu_id, - "icons": [ - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/android/android-launchericon-512-512.png", - "sizes": "512x512", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/android/android-launchericon-192-192.png", - "sizes": "192x192", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/android/android-launchericon-144-144.png", - "sizes": "144x144", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/android/android-launchericon-96-96.png", - "sizes": "96x96", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/android/android-launchericon-72-72.png", - "sizes": "72x72", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/android/android-launchericon-48-48.png", - "sizes": "48x48", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/16.png", - "sizes": "16x16", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/20.png", - "sizes": "20x20", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/29.png", - "sizes": "29x29", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/32.png", - "sizes": "32x32", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/40.png", - "sizes": "40x40", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/50.png", - "sizes": "50x50", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/57.png", - "sizes": "57x57", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/58.png", - "sizes": "58x58", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/60.png", - "sizes": "60x60", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/64.png", - "sizes": "64x64", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/72.png", - "sizes": "72x72", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/76.png", - "sizes": "76x76", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/80.png", - "sizes": "80x80", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/87.png", - "sizes": "87x87", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/100.png", - "sizes": "100x100", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/114.png", - "sizes": "114x114", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/120.png", - "sizes": "120x120", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/128.png", - "sizes": "128x128", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/144.png", - "sizes": "144x144", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/152.png", - "sizes": "152x152", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/167.png", - "sizes": "167x167", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/180.png", - "sizes": "180x180", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/192.png", - "sizes": "192x192", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/256.png", - "sizes": "256x256", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/512.png", - "sizes": "512x512", - }, - { - "src": "https://github.com/cashubtc/cashu-ui/raw/main/ui/icons/circle/ios/1024.png", - "sizes": "1024x1024", - }, - ], - } - ], - } diff --git a/lnbits/extensions/cashu/views_api.py b/lnbits/extensions/cashu/views_api.py deleted file mode 100644 index ad253abf..00000000 --- a/lnbits/extensions/cashu/views_api.py +++ /dev/null @@ -1,382 +0,0 @@ -import json -import math -from http import HTTPStatus -from typing import Dict, List, Union - -import httpx - -# -------- cashu imports -from cashu.core.base import ( - BlindedSignature, - CheckFeesRequest, - CheckFeesResponse, - CheckRequest, - GetMeltResponse, - GetMintResponse, - Invoice, - MeltRequest, - MintRequest, - PostSplitResponse, - Proof, - SplitRequest, -) -from fastapi import Query -from fastapi.params import Depends -from lnurl import decode as decode_lnurl -from loguru import logger -from secp256k1 import PublicKey -from starlette.exceptions import HTTPException - -from lnbits import bolt11 -from lnbits.core.crud import check_internal, get_user -from lnbits.core.services import ( - check_transaction_status, - create_invoice, - fee_reserve, - pay_invoice, -) -from lnbits.core.views.api import api_payment -from lnbits.decorators import WalletTypeInfo, get_key_type, require_admin_key -from lnbits.helpers import urlsafe_short_hash -from lnbits.wallets.base import PaymentStatus - -from . import cashu_ext, ledger -from .crud import create_cashu, delete_cashu, get_cashu, get_cashus -from .models import Cashu - -# --------- extension imports - - -LIGHTNING = True - -######################################## -############### LNBITS MINTS ########### -######################################## - - -@cashu_ext.get("/api/v1/mints", status_code=HTTPStatus.OK) -async def api_cashus( - all_wallets: bool = Query(False), wallet: WalletTypeInfo = Depends(get_key_type) # type: ignore -): - """ - Get all mints of this wallet. - """ - wallet_ids = [wallet.wallet.id] - if all_wallets: - user = await get_user(wallet.wallet.user) - if user: - wallet_ids = user.wallet_ids - - return [cashu.dict() for cashu in await get_cashus(wallet_ids)] - - -@cashu_ext.post("/api/v1/mints", status_code=HTTPStatus.CREATED) -async def api_cashu_create( - data: Cashu, - wallet: WalletTypeInfo = Depends(get_key_type), # type: ignore -): - """ - Create a new mint for this wallet. - """ - cashu_id = urlsafe_short_hash() - # generate a new keyset in cashu - keyset = await ledger.load_keyset(cashu_id) - - cashu = await create_cashu( - cashu_id=cashu_id, keyset_id=keyset.id, wallet_id=wallet.wallet.id, data=data - ) - logger.debug(cashu) - return cashu.dict() - - -@cashu_ext.delete("/api/v1/mints/{cashu_id}") -async def api_cashu_delete( - cashu_id: str, wallet: WalletTypeInfo = Depends(require_admin_key) # type: ignore -): - """ - Delete an existing cashu mint. - """ - cashu = await get_cashu(cashu_id) - - if not cashu: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="Cashu mint does not exist." - ) - - if cashu.wallet != wallet.wallet.id: - raise HTTPException( - status_code=HTTPStatus.FORBIDDEN, detail="Not your Cashu mint." - ) - - await delete_cashu(cashu_id) - raise HTTPException(status_code=HTTPStatus.NO_CONTENT) - - -####################################### -########### CASHU ENDPOINTS ########### -####################################### - - -@cashu_ext.get("/api/v1/{cashu_id}/keys", status_code=HTTPStatus.OK) -async def keys(cashu_id: str = Query(None)) -> dict[int, str]: - """Get the public keys of the mint""" - cashu: Union[Cashu, None] = await get_cashu(cashu_id) - - if not cashu: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="Mint does not exist." - ) - - return ledger.get_keyset(keyset_id=cashu.keyset_id) - - -@cashu_ext.get("/api/v1/{cashu_id}/keysets", status_code=HTTPStatus.OK) -async def keysets(cashu_id: str = Query(None)) -> dict[str, list[str]]: - """Get the public keys of the mint""" - cashu: Union[Cashu, None] = await get_cashu(cashu_id) - - if not cashu: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="Mint does not exist." - ) - - return {"keysets": [cashu.keyset_id]} - - -@cashu_ext.get("/api/v1/{cashu_id}/mint") -async def request_mint(cashu_id: str = Query(None), amount: int = 0) -> GetMintResponse: - """ - Request minting of new tokens. The mint responds with a Lightning invoice. - This endpoint can be used for a Lightning invoice UX flow. - - Call `POST /mint` after paying the invoice. - """ - cashu: Union[Cashu, None] = await get_cashu(cashu_id) - - if not cashu: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="Mint does not exist." - ) - - # create an invoice that the wallet needs to pay - try: - payment_hash, payment_request = await create_invoice( - wallet_id=cashu.wallet, - amount=amount, - memo=f"{cashu.name}", - extra={"tag": "cashu"}, - ) - invoice = Invoice( - amount=amount, pr=payment_request, hash=payment_hash, issued=False - ) - # await store_lightning_invoice(cashu_id, invoice) - await ledger.crud.store_lightning_invoice(invoice=invoice, db=ledger.db) - except Exception as e: - logger.error(e) - raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=str(e)) - - print(f"Lightning invoice: {payment_request}") - resp = GetMintResponse(pr=payment_request, hash=payment_hash) - # return {"pr": payment_request, "hash": payment_hash} - return resp - - -@cashu_ext.post("/api/v1/{cashu_id}/mint") -async def mint_coins( - data: MintRequest, - cashu_id: str = Query(None), - payment_hash: str = Query(None), -) -> List[BlindedSignature]: - """ - Requests the minting of tokens belonging to a paid payment request. - Call this endpoint after `GET /mint`. - """ - cashu: Union[Cashu, None] = await get_cashu(cashu_id) - if cashu is None: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="Mint does not exist." - ) - - if LIGHTNING: - invoice: Invoice = await ledger.crud.get_lightning_invoice( - db=ledger.db, hash=payment_hash - ) - if invoice is None: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, - detail="Mint does not know this invoice.", - ) - if invoice.issued == True: - raise HTTPException( - status_code=HTTPStatus.PAYMENT_REQUIRED, - detail="Tokens already issued for this invoice.", - ) - - total_requested = sum([bm.amount for bm in data.blinded_messages]) - if total_requested > invoice.amount: - raise HTTPException( - status_code=HTTPStatus.PAYMENT_REQUIRED, - detail=f"Requested amount too high: {total_requested}. Invoice amount: {invoice.amount}", - ) - - status: PaymentStatus = await check_transaction_status(cashu.wallet, payment_hash) - - if status.paid != True: - raise HTTPException( - status_code=HTTPStatus.PAYMENT_REQUIRED, detail="Invoice not paid." - ) - try: - keyset = ledger.keysets.keysets[cashu.keyset_id] - - promises = await ledger._generate_promises( - B_s=data.blinded_messages, keyset=keyset - ) - assert len(promises), HTTPException( - status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail="No promises returned." - ) - await ledger.crud.update_lightning_invoice( - db=ledger.db, hash=payment_hash, issued=True - ) - - return promises - except Exception as e: - logger.error(e) - raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=str(e)) - - -@cashu_ext.post("/api/v1/{cashu_id}/melt") -async def melt_coins( - payload: MeltRequest, cashu_id: str = Query(None) -) -> GetMeltResponse: - """Invalidates proofs and pays a Lightning invoice.""" - cashu: Union[None, Cashu] = await get_cashu(cashu_id) - if cashu is None: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="Mint does not exist." - ) - proofs = payload.proofs - invoice = payload.invoice - - # !!!!!!! MAKE SURE THAT PROOFS ARE ONLY FROM THIS CASHU KEYSET ID - # THIS IS NECESSARY BECAUSE THE CASHU BACKEND WILL ACCEPT ANY VALID - # TOKENS - assert all([p.id == cashu.keyset_id for p in proofs]), HTTPException( - status_code=HTTPStatus.METHOD_NOT_ALLOWED, - detail="Error: Tokens are from another mint.", - ) - - assert all([ledger._verify_proof(p) for p in proofs]), HTTPException( - status_code=HTTPStatus.BAD_REQUEST, - detail="Could not verify proofs.", - ) - - total_provided = sum([p["amount"] for p in proofs]) - invoice_obj = bolt11.decode(invoice) - amount = math.ceil(invoice_obj.amount_msat / 1000) - - internal_checking_id = await check_internal(invoice_obj.payment_hash) - - if not internal_checking_id: - fees_msat = fee_reserve(invoice_obj.amount_msat) - else: - fees_msat = 0 - assert total_provided >= amount + fees_msat / 1000, Exception( - f"Provided proofs ({total_provided} sats) not enough for Lightning payment ({amount + fees_msat} sats)." - ) - - await pay_invoice( - wallet_id=cashu.wallet, - payment_request=invoice, - description=f"pay cashu invoice", - extra={"tag": "cashu", "cahsu_name": cashu.name}, - ) - - status: PaymentStatus = await check_transaction_status( - cashu.wallet, invoice_obj.payment_hash - ) - if status.paid == True: - await ledger._invalidate_proofs(proofs) - return GetMeltResponse(paid=status.paid, preimage=status.preimage) - - -@cashu_ext.post("/api/v1/{cashu_id}/check") -async def check_spendable( - payload: CheckRequest, cashu_id: str = Query(None) -) -> Dict[int, bool]: - """Check whether a secret has been spent already or not.""" - cashu: Union[None, Cashu] = await get_cashu(cashu_id) - if cashu is None: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="Mint does not exist." - ) - return await ledger.check_spendable(payload.proofs) - - -@cashu_ext.post("/api/v1/{cashu_id}/checkfees") -async def check_fees( - payload: CheckFeesRequest, cashu_id: str = Query(None) -) -> CheckFeesResponse: - """ - Responds with the fees necessary to pay a Lightning invoice. - Used by wallets for figuring out the fees they need to supply. - This is can be useful for checking whether an invoice is internal (Cashu-to-Cashu). - """ - cashu: Union[None, Cashu] = await get_cashu(cashu_id) - if cashu is None: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="Mint does not exist." - ) - invoice_obj = bolt11.decode(payload.pr) - internal_checking_id = await check_internal(invoice_obj.payment_hash) - - if not internal_checking_id: - fees_msat = fee_reserve(invoice_obj.amount_msat) - else: - fees_msat = 0 - return CheckFeesResponse(fee=fees_msat / 1000) - - -@cashu_ext.post("/api/v1/{cashu_id}/split") -async def split( - payload: SplitRequest, cashu_id: str = Query(None) -) -> PostSplitResponse: - """ - Requetst a set of tokens with amount "total" to be split into two - newly minted sets with amount "split" and "total-split". - """ - cashu: Union[None, Cashu] = await get_cashu(cashu_id) - if cashu is None: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="Mint does not exist." - ) - proofs = payload.proofs - - # !!!!!!! MAKE SURE THAT PROOFS ARE ONLY FROM THIS CASHU KEYSET ID - # THIS IS NECESSARY BECAUSE THE CASHU BACKEND WILL ACCEPT ANY VALID - # TOKENS - if not all([p.id == cashu.keyset_id for p in proofs]): - raise HTTPException( - status_code=HTTPStatus.METHOD_NOT_ALLOWED, - detail="Error: Tokens are from another mint.", - ) - - amount = payload.amount - outputs = payload.outputs.blinded_messages - assert outputs, Exception("no outputs provided.") - split_return = None - try: - keyset = ledger.keysets.keysets[cashu.keyset_id] - split_return = await ledger.split(proofs, amount, outputs, keyset) - except Exception as exc: - raise HTTPException( - status_code=HTTPStatus.BAD_REQUEST, - detail=str(exc), - ) - if not split_return: - raise HTTPException( - status_code=HTTPStatus.BAD_REQUEST, - detail="there was an error with the split", - ) - frst_promises, scnd_promises = split_return - resp = PostSplitResponse(fst=frst_promises, snd=scnd_promises) - return resp diff --git a/lnbits/helpers.py b/lnbits/helpers.py index 9042ece0..83876160 100644 --- a/lnbits/helpers.py +++ b/lnbits/helpers.py @@ -20,8 +20,6 @@ class Extension(NamedTuple): icon: Optional[str] = None contributors: Optional[List[str]] = None hidden: bool = False - migration_module: Optional[str] = None - db_name: Optional[str] = None class ExtensionManager: @@ -68,8 +66,6 @@ class ExtensionManager: config.get("icon"), config.get("contributors"), config.get("hidden") or False, - config.get("migration_module"), - config.get("db_name"), ) ) diff --git a/poetry.lock b/poetry.lock index 1df342c9..5b283d75 100644 --- a/poetry.lock +++ b/poetry.lock @@ -8,7 +8,7 @@ python-versions = ">=3.6,<4.0" [[package]] name = "anyio" -version = "3.6.2" +version = "3.6.1" description = "High level compatibility layer for multiple asynchronous event loop implementations" category = "main" optional = false @@ -22,7 +22,7 @@ typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [package.extras] doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"] -trio = ["trio (>=0.16,<0.22)"] +trio = ["trio (>=0.16)"] [[package]] name = "asgiref" @@ -59,17 +59,17 @@ typing-extensions = {version = ">=3.6.5", markers = "python_version < \"3.8\""} [[package]] name = "attrs" -version = "22.1.0" +version = "21.2.0" description = "Classes Without Boilerplate" category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.extras] -dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] +dev = ["coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "sphinx", "sphinx-notfound-page", "zope.interface"] docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] -tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "mypy", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "six"] [[package]] name = "base58" @@ -100,11 +100,11 @@ python-versions = "*" [[package]] name = "black" -version = "22.10.0" +version = "22.8.0" description = "The uncompromising code formatter." category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6.2" [package.dependencies] click = ">=8.0.0" @@ -121,60 +121,6 @@ d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] -[[package]] -name = "cashu" -version = "0.5.4" -description = "Ecash wallet and mint with Bitcoin Lightning support" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -anyio = {version = "3.6.2", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -attrs = {version = "22.1.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -bech32 = {version = "1.2.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -bitstring = {version = "3.1.9", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -certifi = {version = "2022.9.24", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -cffi = {version = "1.15.1", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -charset-normalizer = {version = "2.0.12", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -click = {version = "8.0.4", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -colorama = {version = "0.4.5", markers = "python_version >= \"3.7\" and python_version < \"4.0\" and platform_system == \"Windows\" or python_version >= \"3.7\" and python_version < \"4.0\" and sys_platform == \"win32\""} -ecdsa = {version = "0.18.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -environs = {version = "9.5.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -fastapi = {version = "0.83.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -h11 = {version = "0.12.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -idna = {version = "3.4", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -importlib-metadata = {version = "5.0.0", markers = "python_version >= \"3.7\" and python_version < \"3.8\""} -iniconfig = {version = "1.1.1", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -loguru = {version = "0.6.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -marshmallow = {version = "3.18.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -outcome = {version = "1.2.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -packaging = {version = "21.3", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -pluggy = {version = "1.0.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -py = {version = "1.11.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -pycparser = {version = "2.21", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -pydantic = {version = "1.10.2", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -pyparsing = {version = "3.0.9", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -pysocks = {version = "1.7.1", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -pytest = {version = "7.1.3", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -pytest-asyncio = {version = "0.19.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -python-bitcoinlib = {version = "0.11.2", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -python-dotenv = {version = "0.21.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -represent = {version = "1.6.0.post0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -requests = {version = "2.27.1", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -secp256k1 = {version = "0.14.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -six = {version = "1.16.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -sniffio = {version = "1.3.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -sqlalchemy = {version = "1.3.24", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -sqlalchemy-aio = {version = "0.17.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -starlette = {version = "0.19.1", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -tomli = {version = "2.0.1", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -typing-extensions = {version = "4.4.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -urllib3 = {version = "1.26.12", markers = "python_version >= \"3.7\" and python_version < \"4\""} -uvicorn = {version = "0.18.3", markers = "python_version >= \"3.7\" and python_version < \"4.0\""} -win32-setctime = {version = "1.1.0", markers = "python_version >= \"3.7\" and python_version < \"4.0\" and sys_platform == \"win32\""} -zipp = {version = "3.9.0", markers = "python_version >= \"3.7\" and python_version < \"3.8\""} - [[package]] name = "Cerberus" version = "1.3.4" @@ -188,15 +134,15 @@ setuptools = "*" [[package]] name = "certifi" -version = "2022.9.24" +version = "2021.5.30" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false -python-versions = ">=3.6" +python-versions = "*" [[package]] name = "cffi" -version = "1.15.1" +version = "1.15.0" description = "Foreign Function Interface for Python calling C code." category = "main" optional = false @@ -207,7 +153,7 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.0.12" +version = "2.0.6" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false @@ -218,7 +164,7 @@ unicode_backport = ["unicodedata2"] [[package]] name = "click" -version = "8.0.4" +version = "8.0.1" description = "Composable command line interface toolkit" category = "main" optional = false @@ -283,7 +229,7 @@ test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0 [[package]] name = "ecdsa" -version = "0.18.0" +version = "0.17.0" description = "ECDSA cryptographic signature library (pure python)" category = "main" optional = false @@ -314,7 +260,7 @@ python-versions = "*" [[package]] name = "environs" -version = "9.5.0" +version = "9.3.3" description = "simplified environment variable parsing" category = "main" optional = false @@ -325,14 +271,14 @@ marshmallow = ">=3.0.0" python-dotenv = "*" [package.extras] -dev = ["dj-database-url", "dj-email-url", "django-cache-url", "flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)", "pytest", "tox"] +dev = ["dj-database-url", "dj-email-url", "django-cache-url", "flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)", "pytest", "tox"] django = ["dj-database-url", "dj-email-url", "django-cache-url"] -lint = ["flake8 (==4.0.1)", "flake8-bugbear (==21.9.2)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)"] +lint = ["flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "mypy (==0.910)", "pre-commit (>=2.4,<3.0)"] tests = ["dj-database-url", "dj-email-url", "django-cache-url", "pytest"] [[package]] name = "fastapi" -version = "0.83.0" +version = "0.78.0" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" category = "main" optional = false @@ -344,13 +290,13 @@ 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)"] +dev = ["autoflake (>=1.4.0,<2.0.0)", "flake8 (>=3.8.3,<4.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.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)"] +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,<4.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]] name = "grpcio" -version = "1.50.0" +version = "1.49.1" description = "HTTP/2-based RPC framework" category = "main" optional = false @@ -360,7 +306,7 @@ python-versions = ">=3.7" six = ">=1.5.2" [package.extras] -protobuf = ["grpcio-tools (>=1.50.0)"] +protobuf = ["grpcio-tools (>=1.49.1)"] [[package]] name = "h11" @@ -421,7 +367,7 @@ socks = ["socksio (>=1.0.0,<2.0.0)"] [[package]] name = "idna" -version = "3.4" +version = "3.2" description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false @@ -429,26 +375,26 @@ python-versions = ">=3.5" [[package]] name = "importlib-metadata" -version = "5.0.0" +version = "4.8.1" description = "Read metadata from Python packages" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" [package.dependencies] typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] perf = ["ipython"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pep517", "pyfakefs", "pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy", "pytest-perf (>=0.9.2)"] [[package]] name = "iniconfig" version = "1.1.1" description = "iniconfig: brain-dead simple config-ini parsing" -category = "main" +category = "dev" optional = false python-versions = "*" @@ -495,7 +441,7 @@ typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "loguru" -version = "0.6.0" +version = "0.5.3" description = "Python logging made (stupidly) simple" category = "main" optional = false @@ -506,7 +452,7 @@ colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} [package.extras] -dev = ["Sphinx (>=4.1.1)", "black (>=19.10b0)", "colorama (>=0.3.4)", "docutils (==0.16)", "flake8 (>=3.7.7)", "isort (>=5.1.1)", "pytest (>=4.6.2)", "pytest-cov (>=2.7.1)", "sphinx-autobuild (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "tox (>=3.9.0)"] +dev = ["Sphinx (>=2.2.1)", "black (>=19.10b0)", "codecov (>=2.0.15)", "colorama (>=0.3.4)", "flake8 (>=3.7.7)", "isort (>=5.1.1)", "pytest (>=4.6.2)", "pytest-cov (>=2.7.1)", "sphinx-autobuild (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "tox (>=3.9.0)", "tox-travis (>=0.12)"] [[package]] name = "MarkupSafe" @@ -518,7 +464,7 @@ python-versions = ">=3.6" [[package]] name = "marshmallow" -version = "3.18.0" +version = "3.17.0" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." category = "main" optional = false @@ -528,9 +474,9 @@ python-versions = ">=3.7" packaging = ">=17.0" [package.extras] -dev = ["flake8 (==5.0.4)", "flake8-bugbear (==22.9.11)", "mypy (==0.971)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] -docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.9)", "sphinx (==5.1.1)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] -lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.9.11)", "mypy (==0.971)", "pre-commit (>=2.4,<3.0)"] +dev = ["flake8 (==4.0.1)", "flake8-bugbear (==22.6.22)", "mypy (==0.961)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.8)", "sphinx (==4.5.0)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["flake8 (==4.0.1)", "flake8-bugbear (==22.6.22)", "mypy (==0.961)", "pre-commit (>=2.4,<3.0)"] tests = ["pytest", "pytz", "simplejson"] [[package]] @@ -575,11 +521,11 @@ python-versions = "*" [[package]] name = "outcome" -version = "1.2.0" +version = "1.1.0" description = "Capture the outcome of Python function calls." category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" [package.dependencies] attrs = ">=19.2.0" @@ -608,7 +554,7 @@ six = "*" [[package]] name = "pathspec" -version = "0.10.2" +version = "0.10.1" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false @@ -616,21 +562,21 @@ python-versions = ">=3.7" [[package]] name = "platformdirs" -version = "2.5.4" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "2.5.2" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "dev" optional = false python-versions = ">=3.7" [package.extras] -docs = ["furo (>=2022.9.29)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.4)"] -test = ["appdirs (==1.4.4)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] +test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] [[package]] name = "pluggy" version = "1.0.0" description = "plugin and hook calling mechanisms for python" -category = "main" +category = "dev" optional = false python-versions = ">=3.6" @@ -643,7 +589,7 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "protobuf" -version = "4.21.9" +version = "4.21.7" description = "" category = "main" optional = false @@ -661,7 +607,7 @@ python-versions = ">=3.6" name = "py" version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "main" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -683,14 +629,14 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pydantic" -version = "1.10.2" -description = "Data validation and settings management using python type hints" +version = "1.8.2" +description = "Data validation and settings management using python 3.6 type hinting" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6.1" [package.dependencies] -typing-extensions = ">=4.1.0" +typing-extensions = ">=3.7.4.3" [package.extras] dotenv = ["python-dotenv (>=0.10.4)"] @@ -786,7 +732,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" name = "pytest" version = "7.1.3" description = "pytest: simple powerful testing with Python" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -807,7 +753,7 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2. name = "pytest-asyncio" version = "0.19.0" description = "Pytest support for asyncio" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -833,21 +779,13 @@ pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] -[[package]] -name = "python-bitcoinlib" -version = "0.11.2" -description = "The Swiss Army Knife of the Bitcoin protocol." -category = "main" -optional = false -python-versions = "*" - [[package]] name = "python-dotenv" -version = "0.21.0" +version = "0.19.0" description = "Read key-value pairs from a .env file and set them as environment variables" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.5" [package.extras] cli = ["click (>=5.0)"] @@ -874,24 +812,6 @@ six = ">=1.8.0" [package.extras] test = ["ipython", "mock", "pytest (>=3.0.5)"] -[[package]] -name = "requests" -version = "2.27.1" -description = "Python HTTP for Humans." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] - [[package]] name = "rfc3986" version = "1.5.0" @@ -919,7 +839,7 @@ cffi = ">=1.3.0" [[package]] name = "setuptools" -version = "65.6.3" +version = "65.4.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "main" optional = false @@ -927,7 +847,7 @@ python-versions = ">=3.7" [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mock", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] @@ -948,15 +868,15 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "sniffio" -version = "1.3.0" +version = "1.2.0" description = "Sniff out which async library your code is running under" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.5" [[package]] name = "SQLAlchemy" -version = "1.3.24" +version = "1.3.23" description = "Database Abstraction Library" category = "main" optional = false @@ -1019,7 +939,7 @@ full = ["itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests"] name = "tomli" version = "2.0.1" description = "A lil' TOML parser" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" @@ -1033,7 +953,7 @@ python-versions = ">=3.6" [[package]] name = "types-protobuf" -version = "3.20.4.6" +version = "3.20.4" description = "Typing stubs for protobuf" category = "dev" optional = false @@ -1041,28 +961,15 @@ python-versions = "*" [[package]] name = "typing-extensions" -version = "4.4.0" -description = "Backported and Experimental Type Hints for Python 3.7+" +version = "3.10.0.2" +description = "Backported and Experimental Type Hints for Python 3.5+" category = "main" optional = false -python-versions = ">=3.7" - -[[package]] -name = "urllib3" -version = "1.26.12" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +python-versions = "*" [[package]] name = "uvicorn" -version = "0.18.3" +version = "0.18.1" description = "The lightning-fast ASGI server." category = "main" optional = false @@ -1074,7 +981,7 @@ h11 = ">=0.8" typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [package.extras] -standard = ["colorama (>=0.4)", "httptools (>=0.4.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.0)"] +standard = ["PyYAML (>=5.1)", "colorama (>=0.4)", "httptools (>=0.4.0)", "python-dotenv (>=0.13)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.0)"] [[package]] name = "uvloop" @@ -1131,20 +1038,20 @@ dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] [[package]] name = "zipp" -version = "3.9.0" +version = "3.5.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] -testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] +testing = ["func-timeout", "jaraco.itertools", "pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy"] [metadata] lock-version = "1.1" python-versions = "^3.10 | ^3.9 | ^3.8 | ^3.7" -content-hash = "d8d786accf4ece1207e2f54ac37aba6601d089f9c1ca1269bf235d67b8e3e2a7" +content-hash = "c4a01d5bfc24a8008348b6bd954717354554310afaaecbfc2a14222ad25aca42" [metadata.files] aiofiles = [ @@ -1152,8 +1059,8 @@ aiofiles = [ {file = "aiofiles-0.8.0.tar.gz", hash = "sha256:8334f23235248a3b2e83b2c3a78a22674f39969b96397126cc93664d9a901e59"}, ] anyio = [ - {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"}, - {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"}, + {file = "anyio-3.6.1-py3-none-any.whl", hash = "sha256:cb29b9c70620506a9a8f87a309591713446953302d7d995344d0d7c6c0c9a7be"}, + {file = "anyio-3.6.1.tar.gz", hash = "sha256:413adf95f93886e442aea925f3ee43baa5a765a64a0f52c6081894f9992fdd0b"}, ] asgiref = [ {file = "asgiref-3.4.1-py3-none-any.whl", hash = "sha256:ffc141aa908e6f175673e7b1b3b7af4fdb0ecb738fc5c8b88f69f055c2415214"}, @@ -1168,8 +1075,8 @@ async-timeout = [ {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, ] attrs = [ - {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, - {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, + {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, + {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, ] base58 = [ {file = "base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2"}, @@ -1185,112 +1092,96 @@ bitstring = [ {file = "bitstring-3.1.9.tar.gz", hash = "sha256:a5848a3f63111785224dca8bb4c0a75b62ecdef56a042c8d6be74b16f7e860e7"}, ] black = [ - {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, - {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, - {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, - {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, - {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, - {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, - {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, - {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, - {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, - {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, - {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, - {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, - {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, - {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, - {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, - {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, - {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, - {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, - {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, - {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, - {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, -] -cashu = [ - {file = "cashu-0.5.4-py3-none-any.whl", hash = "sha256:de02245387fe0affaa1a02255ab9592c4115fd1deae57ccae3eee4610ab40ebb"}, - {file = "cashu-0.5.4.tar.gz", hash = "sha256:9fbfe21828282697bcc8ab7690c23509b867c9851beb525efd04ed386b84db10"}, + {file = "black-22.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd"}, + {file = "black-22.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5107ea36b2b61917956d018bd25129baf9ad1125e39324a9b18248d362156a27"}, + {file = "black-22.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8166b7bfe5dcb56d325385bd1d1e0f635f24aae14b3ae437102dedc0c186747"}, + {file = "black-22.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd82842bb272297503cbec1a2600b6bfb338dae017186f8f215c8958f8acf869"}, + {file = "black-22.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d839150f61d09e7217f52917259831fe2b689f5c8e5e32611736351b89bb2a90"}, + {file = "black-22.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a05da0430bd5ced89176db098567973be52ce175a55677436a271102d7eaa3fe"}, + {file = "black-22.8.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a098a69a02596e1f2a58a2a1c8d5a05d5a74461af552b371e82f9fa4ada8342"}, + {file = "black-22.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5594efbdc35426e35a7defa1ea1a1cb97c7dbd34c0e49af7fb593a36bd45edab"}, + {file = "black-22.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a983526af1bea1e4cf6768e649990f28ee4f4137266921c2c3cee8116ae42ec3"}, + {file = "black-22.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b2c25f8dea5e8444bdc6788a2f543e1fb01494e144480bc17f806178378005e"}, + {file = "black-22.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:78dd85caaab7c3153054756b9fe8c611efa63d9e7aecfa33e533060cb14b6d16"}, + {file = "black-22.8.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cea1b2542d4e2c02c332e83150e41e3ca80dc0fb8de20df3c5e98e242156222c"}, + {file = "black-22.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b879eb439094751185d1cfdca43023bc6786bd3c60372462b6f051efa6281a5"}, + {file = "black-22.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a12e4e1353819af41df998b02c6742643cfef58282915f781d0e4dd7a200411"}, + {file = "black-22.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3a73f66b6d5ba7288cd5d6dad9b4c9b43f4e8a4b789a94bf5abfb878c663eb3"}, + {file = "black-22.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:e981e20ec152dfb3e77418fb616077937378b322d7b26aa1ff87717fb18b4875"}, + {file = "black-22.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8ce13ffed7e66dda0da3e0b2eb1bdfc83f5812f66e09aca2b0978593ed636b6c"}, + {file = "black-22.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:32a4b17f644fc288c6ee2bafdf5e3b045f4eff84693ac069d87b1a347d861497"}, + {file = "black-22.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ad827325a3a634bae88ae7747db1a395d5ee02cf05d9aa7a9bd77dfb10e940c"}, + {file = "black-22.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53198e28a1fb865e9fe97f88220da2e44df6da82b18833b588b1883b16bb5d41"}, + {file = "black-22.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bc4d4123830a2d190e9cc42a2e43570f82ace35c3aeb26a512a2102bce5af7ec"}, + {file = "black-22.8.0-py3-none-any.whl", hash = "sha256:d2c21d439b2baf7aa80d6dd4e3659259be64c6f49dfd0f32091063db0e006db4"}, + {file = "black-22.8.0.tar.gz", hash = "sha256:792f7eb540ba9a17e8656538701d3eb1afcb134e3b45b71f20b25c77a8db7e6e"}, ] Cerberus = [ {file = "Cerberus-1.3.4.tar.gz", hash = "sha256:d1b21b3954b2498d9a79edf16b3170a3ac1021df88d197dc2ce5928ba519237c"}, ] certifi = [ - {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, - {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, + {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, + {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, ] cffi = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, + {file = "cffi-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0"}, + {file = "cffi-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14"}, + {file = "cffi-1.15.0-cp27-cp27m-win32.whl", hash = "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474"}, + {file = "cffi-1.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27"}, + {file = "cffi-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2"}, + {file = "cffi-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962"}, + {file = "cffi-1.15.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382"}, + {file = "cffi-1.15.0-cp310-cp310-win32.whl", hash = "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55"}, + {file = "cffi-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0"}, + {file = "cffi-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8"}, + {file = "cffi-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605"}, + {file = "cffi-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e"}, + {file = "cffi-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc"}, + {file = "cffi-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2"}, + {file = "cffi-1.15.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7"}, + {file = "cffi-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66"}, + {file = "cffi-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029"}, + {file = "cffi-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728"}, + {file = "cffi-1.15.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6"}, + {file = "cffi-1.15.0-cp38-cp38-win32.whl", hash = "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c"}, + {file = "cffi-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a"}, + {file = "cffi-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df"}, + {file = "cffi-1.15.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8"}, + {file = "cffi-1.15.0-cp39-cp39-win32.whl", hash = "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a"}, + {file = "cffi-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139"}, + {file = "cffi-1.15.0.tar.gz", hash = "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, - {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, + {file = "charset-normalizer-2.0.6.tar.gz", hash = "sha256:5ec46d183433dcbd0ab716f2d7f29d8dee50505b3fdb40c6b985c7c4f5a3591f"}, + {file = "charset_normalizer-2.0.6-py3-none-any.whl", hash = "sha256:5d209c0a931f215cee683b6445e2d77677e7e75e159f78def0db09d68fafcaa6"}, ] click = [ - {file = "click-8.0.4-py3-none-any.whl", hash = "sha256:6a7a62563bbfabfda3a38f3023a1db4a35978c0abd76f6c9605ecd6554d6d9b1"}, - {file = "click-8.0.4.tar.gz", hash = "sha256:8458d7b1287c5fb128c90e23381cf99dcde74beaf6c7ff6384ce84d6fe090adb"}, + {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, + {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"}, ] coincurve = [ {file = "coincurve-17.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac8c87d6fd080faa74e7ecf64a6ed20c11a254863238759eb02c3f13ad12b0c4"}, @@ -1407,8 +1298,8 @@ cryptography = [ {file = "cryptography-36.0.2.tar.gz", hash = "sha256:70f8f4f7bb2ac9f340655cbac89d68c527af5bb4387522a8413e841e3e6628c9"}, ] ecdsa = [ - {file = "ecdsa-0.18.0-py2.py3-none-any.whl", hash = "sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd"}, - {file = "ecdsa-0.18.0.tar.gz", hash = "sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49"}, + {file = "ecdsa-0.17.0-py2.py3-none-any.whl", hash = "sha256:5cf31d5b33743abe0dfc28999036c849a69d548f994b535e527ee3cb7f3ef676"}, + {file = "ecdsa-0.17.0.tar.gz", hash = "sha256:b9f500bb439e4153d0330610f5d26baaf18d17b8ced1bc54410d189385ea68aa"}, ] embit = [ {file = "embit-0.4.9.tar.gz", hash = "sha256:992332bd89af6e2d027e26fe437eb14aa33997db08c882c49064d49c3e6f4ab9"}, @@ -1419,59 +1310,59 @@ enum34 = [ {file = "enum34-1.1.10.tar.gz", hash = "sha256:cce6a7477ed816bd2542d03d53db9f0db935dd013b70f336a95c73979289f248"}, ] environs = [ - {file = "environs-9.5.0-py2.py3-none-any.whl", hash = "sha256:1e549569a3de49c05f856f40bce86979e7d5ffbbc4398e7f338574c220189124"}, - {file = "environs-9.5.0.tar.gz", hash = "sha256:a76307b36fbe856bdca7ee9161e6c466fd7fcffc297109a118c59b54e27e30c9"}, + {file = "environs-9.3.3-py2.py3-none-any.whl", hash = "sha256:ee5466156b50fe03aa9fec6e720feea577b5bf515d7f21b2c46608272557ba26"}, + {file = "environs-9.3.3.tar.gz", hash = "sha256:72b867ff7b553076cdd90f3ee01ecc1cf854987639c9c459f0ed0d3d44ae490c"}, ] fastapi = [ - {file = "fastapi-0.83.0-py3-none-any.whl", hash = "sha256:694a2b6c2607a61029a4be1c6613f84d74019cb9f7a41c7a475dca8e715f9368"}, - {file = "fastapi-0.83.0.tar.gz", hash = "sha256:96eb692350fe13d7a9843c3c87a874f0d45102975257dd224903efd6c0fde3bd"}, + {file = "fastapi-0.78.0-py3-none-any.whl", hash = "sha256:15fcabd5c78c266fa7ae7d8de9b384bfc2375ee0503463a6febbe3bab69d6f65"}, + {file = "fastapi-0.78.0.tar.gz", hash = "sha256:3233d4a789ba018578658e2af1a4bb5e38bdd122ff722b313666a9b2c6786a83"}, ] grpcio = [ - {file = "grpcio-1.50.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:906f4d1beb83b3496be91684c47a5d870ee628715227d5d7c54b04a8de802974"}, - {file = "grpcio-1.50.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:2d9fd6e38b16c4d286a01e1776fdf6c7a4123d99ae8d6b3f0b4a03a34bf6ce45"}, - {file = "grpcio-1.50.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:4b123fbb7a777a2fedec684ca0b723d85e1d2379b6032a9a9b7851829ed3ca9a"}, - {file = "grpcio-1.50.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2f77a90ba7b85bfb31329f8eab9d9540da2cf8a302128fb1241d7ea239a5469"}, - {file = "grpcio-1.50.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eea18a878cffc804506d39c6682d71f6b42ec1c151d21865a95fae743fda500"}, - {file = "grpcio-1.50.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b71916fa8f9eb2abd93151fafe12e18cebb302686b924bd4ec39266211da525"}, - {file = "grpcio-1.50.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:95ce51f7a09491fb3da8cf3935005bff19983b77c4e9437ef77235d787b06842"}, - {file = "grpcio-1.50.0-cp310-cp310-win32.whl", hash = "sha256:f7025930039a011ed7d7e7ef95a1cb5f516e23c5a6ecc7947259b67bea8e06ca"}, - {file = "grpcio-1.50.0-cp310-cp310-win_amd64.whl", hash = "sha256:05f7c248e440f538aaad13eee78ef35f0541e73498dd6f832fe284542ac4b298"}, - {file = "grpcio-1.50.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:ca8a2254ab88482936ce941485c1c20cdeaef0efa71a61dbad171ab6758ec998"}, - {file = "grpcio-1.50.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:3b611b3de3dfd2c47549ca01abfa9bbb95937eb0ea546ea1d762a335739887be"}, - {file = "grpcio-1.50.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a4cd8cb09d1bc70b3ea37802be484c5ae5a576108bad14728f2516279165dd7"}, - {file = "grpcio-1.50.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:156f8009e36780fab48c979c5605eda646065d4695deea4cfcbcfdd06627ddb6"}, - {file = "grpcio-1.50.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de411d2b030134b642c092e986d21aefb9d26a28bf5a18c47dd08ded411a3bc5"}, - {file = "grpcio-1.50.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d144ad10eeca4c1d1ce930faa105899f86f5d99cecfe0d7224f3c4c76265c15e"}, - {file = "grpcio-1.50.0-cp311-cp311-win32.whl", hash = "sha256:92d7635d1059d40d2ec29c8bf5ec58900120b3ce5150ef7414119430a4b2dd5c"}, - {file = "grpcio-1.50.0-cp311-cp311-win_amd64.whl", hash = "sha256:ce8513aee0af9c159319692bfbf488b718d1793d764798c3d5cff827a09e25ef"}, - {file = "grpcio-1.50.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:8e8999a097ad89b30d584c034929f7c0be280cd7851ac23e9067111167dcbf55"}, - {file = "grpcio-1.50.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:a50a1be449b9e238b9bd43d3857d40edf65df9416dea988929891d92a9f8a778"}, - {file = "grpcio-1.50.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:cf151f97f5f381163912e8952eb5b3afe89dec9ed723d1561d59cabf1e219a35"}, - {file = "grpcio-1.50.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a23d47f2fc7111869f0ff547f771733661ff2818562b04b9ed674fa208e261f4"}, - {file = "grpcio-1.50.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84d04dec64cc4ed726d07c5d17b73c343c8ddcd6b59c7199c801d6bbb9d9ed1"}, - {file = "grpcio-1.50.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:67dd41a31f6fc5c7db097a5c14a3fa588af54736ffc174af4411d34c4f306f68"}, - {file = "grpcio-1.50.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8d4c8e73bf20fb53fe5a7318e768b9734cf122fe671fcce75654b98ba12dfb75"}, - {file = "grpcio-1.50.0-cp37-cp37m-win32.whl", hash = "sha256:7489dbb901f4fdf7aec8d3753eadd40839c9085967737606d2c35b43074eea24"}, - {file = "grpcio-1.50.0-cp37-cp37m-win_amd64.whl", hash = "sha256:531f8b46f3d3db91d9ef285191825d108090856b3bc86a75b7c3930f16ce432f"}, - {file = "grpcio-1.50.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:d534d169673dd5e6e12fb57cc67664c2641361e1a0885545495e65a7b761b0f4"}, - {file = "grpcio-1.50.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:1d8d02dbb616c0a9260ce587eb751c9c7dc689bc39efa6a88cc4fa3e9c138a7b"}, - {file = "grpcio-1.50.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:baab51dcc4f2aecabf4ed1e2f57bceab240987c8b03533f1cef90890e6502067"}, - {file = "grpcio-1.50.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40838061e24f960b853d7bce85086c8e1b81c6342b1f4c47ff0edd44bbae2722"}, - {file = "grpcio-1.50.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:931e746d0f75b2a5cff0a1197d21827a3a2f400c06bace036762110f19d3d507"}, - {file = "grpcio-1.50.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:15f9e6d7f564e8f0776770e6ef32dac172c6f9960c478616c366862933fa08b4"}, - {file = "grpcio-1.50.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a4c23e54f58e016761b576976da6a34d876420b993f45f66a2bfb00363ecc1f9"}, - {file = "grpcio-1.50.0-cp38-cp38-win32.whl", hash = "sha256:3e4244c09cc1b65c286d709658c061f12c61c814be0b7030a2d9966ff02611e0"}, - {file = "grpcio-1.50.0-cp38-cp38-win_amd64.whl", hash = "sha256:8e69aa4e9b7f065f01d3fdcecbe0397895a772d99954bb82eefbb1682d274518"}, - {file = "grpcio-1.50.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:af98d49e56605a2912cf330b4627e5286243242706c3a9fa0bcec6e6f68646fc"}, - {file = "grpcio-1.50.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:080b66253f29e1646ac53ef288c12944b131a2829488ac3bac8f52abb4413c0d"}, - {file = "grpcio-1.50.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:ab5d0e3590f0a16cb88de4a3fa78d10eb66a84ca80901eb2c17c1d2c308c230f"}, - {file = "grpcio-1.50.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb11464f480e6103c59d558a3875bd84eed6723f0921290325ebe97262ae1347"}, - {file = "grpcio-1.50.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e07fe0d7ae395897981d16be61f0db9791f482f03fee7d1851fe20ddb4f69c03"}, - {file = "grpcio-1.50.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d75061367a69808ab2e84c960e9dce54749bcc1e44ad3f85deee3a6c75b4ede9"}, - {file = "grpcio-1.50.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ae23daa7eda93c1c49a9ecc316e027ceb99adbad750fbd3a56fa9e4a2ffd5ae0"}, - {file = "grpcio-1.50.0-cp39-cp39-win32.whl", hash = "sha256:177afaa7dba3ab5bfc211a71b90da1b887d441df33732e94e26860b3321434d9"}, - {file = "grpcio-1.50.0-cp39-cp39-win_amd64.whl", hash = "sha256:ea8ccf95e4c7e20419b7827aa5b6da6f02720270686ac63bd3493a651830235c"}, - {file = "grpcio-1.50.0.tar.gz", hash = "sha256:12b479839a5e753580b5e6053571de14006157f2ef9b71f38c56dc9b23b95ad6"}, + {file = "grpcio-1.49.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:fd86040232e805b8e6378b2348c928490ee595b058ce9aaa27ed8e4b0f172b20"}, + {file = "grpcio-1.49.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6fd0c9cede9552bf00f8c5791d257d5bf3790d7057b26c59df08be5e7a1e021d"}, + {file = "grpcio-1.49.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:d0d402e158d4e84e49c158cb5204119d55e1baf363ee98d6cb5dce321c3a065d"}, + {file = "grpcio-1.49.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:822ceec743d42a627e64ea266059a62d214c5a3cdfcd0d7fe2b7a8e4e82527c7"}, + {file = "grpcio-1.49.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2106d9c16527f0a85e2eea6e6b91a74fc99579c60dd810d8690843ea02bc0f5f"}, + {file = "grpcio-1.49.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:52dd02b7e7868233c571b49bc38ebd347c3bb1ff8907bb0cb74cb5f00c790afc"}, + {file = "grpcio-1.49.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:120fecba2ec5d14b5a15d11063b39783fda8dc8d24addd83196acb6582cabd9b"}, + {file = "grpcio-1.49.1-cp310-cp310-win32.whl", hash = "sha256:f1a3b88e3c53c1a6e6bed635ec1bbb92201bb6a1f2db186179f7f3f244829788"}, + {file = "grpcio-1.49.1-cp310-cp310-win_amd64.whl", hash = "sha256:a7d0017b92d3850abea87c1bdec6ea41104e71c77bca44c3e17f175c6700af62"}, + {file = "grpcio-1.49.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:9fb17ff8c0d56099ac6ebfa84f670c5a62228d6b5c695cf21c02160c2ac1446b"}, + {file = "grpcio-1.49.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:075f2d06e3db6b48a2157a1bcd52d6cbdca980dd18988fe6afdb41795d51625f"}, + {file = "grpcio-1.49.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46d93a1b4572b461a227f1db6b8d35a88952db1c47e5fadcf8b8a2f0e1dd9201"}, + {file = "grpcio-1.49.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc79b2b37d779ac42341ddef40ad5bf0966a64af412c89fc2b062e3ddabb093f"}, + {file = "grpcio-1.49.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5f8b3a971c7820ea9878f3fd70086240a36aeee15d1b7e9ecbc2743b0e785568"}, + {file = "grpcio-1.49.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49b301740cf5bc8fed4fee4c877570189ae3951432d79fa8e524b09353659811"}, + {file = "grpcio-1.49.1-cp311-cp311-win32.whl", hash = "sha256:1c66a25afc6c71d357867b341da594a5587db5849b48f4b7d5908d236bb62ede"}, + {file = "grpcio-1.49.1-cp311-cp311-win_amd64.whl", hash = "sha256:6b6c3a95d27846f4145d6967899b3ab25fffc6ae99544415e1adcacef84842d2"}, + {file = "grpcio-1.49.1-cp37-cp37m-linux_armv7l.whl", hash = "sha256:1cc400c8a2173d1c042997d98a9563e12d9bb3fb6ad36b7f355bc77c7663b8af"}, + {file = "grpcio-1.49.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:34f736bd4d0deae90015c0e383885b431444fe6b6c591dea288173df20603146"}, + {file = "grpcio-1.49.1-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:196082b9c89ebf0961dcd77cb114bed8171964c8e3063b9da2fb33536a6938ed"}, + {file = "grpcio-1.49.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c9f89c42749890618cd3c2464e1fbf88446e3d2f67f1e334c8e5db2f3272bbd"}, + {file = "grpcio-1.49.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64419cb8a5b612cdb1550c2fd4acbb7d4fb263556cf4625f25522337e461509e"}, + {file = "grpcio-1.49.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:8a5272061826e6164f96e3255405ef6f73b88fd3e8bef464c7d061af8585ac62"}, + {file = "grpcio-1.49.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ea9d0172445241ad7cb49577314e39d0af2c5267395b3561d7ced5d70458a9f3"}, + {file = "grpcio-1.49.1-cp37-cp37m-win32.whl", hash = "sha256:2070e87d95991473244c72d96d13596c751cb35558e11f5df5414981e7ed2492"}, + {file = "grpcio-1.49.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fcedcab49baaa9db4a2d240ac81f2d57eb0052b1c6a9501b46b8ae912720fbf"}, + {file = "grpcio-1.49.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:afbb3475cf7f4f7d380c2ca37ee826e51974f3e2665613996a91d6a58583a534"}, + {file = "grpcio-1.49.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a4f9ba141380abde6c3adc1727f21529137a2552002243fa87c41a07e528245c"}, + {file = "grpcio-1.49.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:cf0a1fb18a7204b9c44623dfbd1465b363236ce70c7a4ed30402f9f60d8b743b"}, + {file = "grpcio-1.49.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17bb6fe72784b630728c6cff9c9d10ccc3b6d04e85da6e0a7b27fb1d135fac62"}, + {file = "grpcio-1.49.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18305d5a082d1593b005a895c10041f833b16788e88b02bb81061f5ebcc465df"}, + {file = "grpcio-1.49.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b6a1b39e59ac5a3067794a0e498911cf2e37e4b19ee9e9977dc5e7051714f13f"}, + {file = "grpcio-1.49.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0e20d59aafc086b1cc68400463bddda6e41d3e5ed30851d1e2e0f6a2e7e342d3"}, + {file = "grpcio-1.49.1-cp38-cp38-win32.whl", hash = "sha256:e1e83233d4680863a421f3ee4a7a9b80d33cd27ee9ed7593bc93f6128302d3f2"}, + {file = "grpcio-1.49.1-cp38-cp38-win_amd64.whl", hash = "sha256:221d42c654d2a41fa31323216279c73ed17d92f533bc140a3390cc1bd78bf63c"}, + {file = "grpcio-1.49.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:fa9e6e61391e99708ac87fc3436f6b7b9c6b845dc4639b406e5e61901e1aacde"}, + {file = "grpcio-1.49.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9b449e966ef518ce9c860d21f8afe0b0f055220d95bc710301752ac1db96dd6a"}, + {file = "grpcio-1.49.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:aa34d2ad9f24e47fa9a3172801c676e4037d862247e39030165fe83821a7aafd"}, + {file = "grpcio-1.49.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5207f4eed1b775d264fcfe379d8541e1c43b878f2b63c0698f8f5c56c40f3d68"}, + {file = "grpcio-1.49.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b24a74651438d45619ac67004638856f76cc13d78b7478f2457754cbcb1c8ad"}, + {file = "grpcio-1.49.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fe763781669790dc8b9618e7e677c839c87eae6cf28b655ee1fa69ae04eea03f"}, + {file = "grpcio-1.49.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2f2ff7ba0f8f431f32d4b4bc3a3713426949d3533b08466c4ff1b2b475932ca8"}, + {file = "grpcio-1.49.1-cp39-cp39-win32.whl", hash = "sha256:08ff74aec8ff457a89b97152d36cb811dcc1d17cd5a92a65933524e363327394"}, + {file = "grpcio-1.49.1-cp39-cp39-win_amd64.whl", hash = "sha256:274ffbb39717918c514b35176510ae9be06e1d93121e84d50b350861dcb9a705"}, + {file = "grpcio-1.49.1.tar.gz", hash = "sha256:d4725fc9ec8e8822906ae26bb26f5546891aa7fbc3443de970cc556d43a5c99f"}, ] h11 = [ {file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"}, @@ -1522,12 +1413,12 @@ httpx = [ {file = "httpx-0.23.0.tar.gz", hash = "sha256:f28eac771ec9eb4866d3fb4ab65abd42d38c424739e80c08d8d20570de60b0ef"}, ] idna = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"}, + {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"}, ] importlib-metadata = [ - {file = "importlib_metadata-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, - {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, + {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"}, + {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, @@ -1546,8 +1437,8 @@ lnurl = [ {file = "lnurl-0.3.6.tar.gz", hash = "sha256:8af07460115a48f3122a5a9c9a6062bee3897d5f6ab4c9a60f6561a83a8234f6"}, ] loguru = [ - {file = "loguru-0.6.0-py3-none-any.whl", hash = "sha256:4e2414d534a2ab57573365b3e6d0234dfb1d84b68b7f3b948e6fb743860a77c3"}, - {file = "loguru-0.6.0.tar.gz", hash = "sha256:066bd06758d0a513e9836fd9c6b5a75bfb3fd36841f4b996bc60b547a309d41c"}, + {file = "loguru-0.5.3-py3-none-any.whl", hash = "sha256:f8087ac396b5ee5f67c963b495d615ebbceac2796379599820e324419d53667c"}, + {file = "loguru-0.5.3.tar.gz", hash = "sha256:b28e72ac7a98be3d28ad28570299a393dfcd32e5e3f6a353dec94675767b6319"}, ] MarkupSafe = [ {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, @@ -1621,8 +1512,8 @@ MarkupSafe = [ {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, ] marshmallow = [ - {file = "marshmallow-3.18.0-py3-none-any.whl", hash = "sha256:35e02a3a06899c9119b785c12a22f4cda361745d66a71ab691fd7610202ae104"}, - {file = "marshmallow-3.18.0.tar.gz", hash = "sha256:6804c16114f7fce1f5b4dadc31f4674af23317fcc7f075da21e35c1a35d781f7"}, + {file = "marshmallow-3.17.0-py3-none-any.whl", hash = "sha256:00040ab5ea0c608e8787137627a8efae97fabd60552a05dc889c888f814e75eb"}, + {file = "marshmallow-3.17.0.tar.gz", hash = "sha256:635fb65a3285a31a30f276f30e958070f5214c7196202caa5c7ecf28f5274bc7"}, ] mock = [ {file = "mock-4.0.3-py3-none-any.whl", hash = "sha256:122fcb64ee37cfad5b3f48d7a7d51875d7031aaf3d8be7c42e2bee25044eee62"}, @@ -1658,8 +1549,8 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] outcome = [ - {file = "outcome-1.2.0-py2.py3-none-any.whl", hash = "sha256:c4ab89a56575d6d38a05aa16daeaa333109c1f96167aba8901ab18b6b5e0f7f5"}, - {file = "outcome-1.2.0.tar.gz", hash = "sha256:6f82bd3de45da303cf1f771ecafa1633750a358436a8bb60e06a1ceb745d2672"}, + {file = "outcome-1.1.0-py2.py3-none-any.whl", hash = "sha256:c7dd9375cfd3c12db9801d080a3b63d4b0a261aa996c4c13152380587288d958"}, + {file = "outcome-1.1.0.tar.gz", hash = "sha256:e862f01d4e626e63e8f92c38d1f8d5546d3f9cce989263c521b2e7990d186967"}, ] packaging = [ {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, @@ -1670,32 +1561,32 @@ pathlib2 = [ {file = "pathlib2-2.3.7.post1.tar.gz", hash = "sha256:9fe0edad898b83c0c3e199c842b27ed216645d2e177757b2dd67384d4113c641"}, ] pathspec = [ - {file = "pathspec-0.10.2-py3-none-any.whl", hash = "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5"}, - {file = "pathspec-0.10.2.tar.gz", hash = "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0"}, + {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"}, + {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, ] platformdirs = [ - {file = "platformdirs-2.5.4-py3-none-any.whl", hash = "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10"}, - {file = "platformdirs-2.5.4.tar.gz", hash = "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] protobuf = [ - {file = "protobuf-4.21.9-cp310-abi3-win32.whl", hash = "sha256:6e0be9f09bf9b6cf497b27425487706fa48c6d1632ddd94dab1a5fe11a422392"}, - {file = "protobuf-4.21.9-cp310-abi3-win_amd64.whl", hash = "sha256:a7d0ea43949d45b836234f4ebb5ba0b22e7432d065394b532cdca8f98415e3cf"}, - {file = "protobuf-4.21.9-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:b5ab0b8918c136345ff045d4b3d5f719b505b7c8af45092d7f45e304f55e50a1"}, - {file = "protobuf-4.21.9-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:2c9c2ed7466ad565f18668aa4731c535511c5d9a40c6da39524bccf43e441719"}, - {file = "protobuf-4.21.9-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:e575c57dc8b5b2b2caa436c16d44ef6981f2235eb7179bfc847557886376d740"}, - {file = "protobuf-4.21.9-cp37-cp37m-win32.whl", hash = "sha256:9227c14010acd9ae7702d6467b4625b6fe853175a6b150e539b21d2b2f2b409c"}, - {file = "protobuf-4.21.9-cp37-cp37m-win_amd64.whl", hash = "sha256:a419cc95fca8694804709b8c4f2326266d29659b126a93befe210f5bbc772536"}, - {file = "protobuf-4.21.9-cp38-cp38-win32.whl", hash = "sha256:5b0834e61fb38f34ba8840d7dcb2e5a2f03de0c714e0293b3963b79db26de8ce"}, - {file = "protobuf-4.21.9-cp38-cp38-win_amd64.whl", hash = "sha256:84ea107016244dfc1eecae7684f7ce13c788b9a644cd3fca5b77871366556444"}, - {file = "protobuf-4.21.9-cp39-cp39-win32.whl", hash = "sha256:f9eae277dd240ae19bb06ff4e2346e771252b0e619421965504bd1b1bba7c5fa"}, - {file = "protobuf-4.21.9-cp39-cp39-win_amd64.whl", hash = "sha256:6e312e280fbe3c74ea9e080d9e6080b636798b5e3939242298b591064470b06b"}, - {file = "protobuf-4.21.9-py2.py3-none-any.whl", hash = "sha256:7eb8f2cc41a34e9c956c256e3ac766cf4e1a4c9c925dc757a41a01be3e852965"}, - {file = "protobuf-4.21.9-py3-none-any.whl", hash = "sha256:48e2cd6b88c6ed3d5877a3ea40df79d08374088e89bedc32557348848dff250b"}, - {file = "protobuf-4.21.9.tar.gz", hash = "sha256:61f21493d96d2a77f9ca84fefa105872550ab5ef71d21c458eb80edcf4885a99"}, + {file = "protobuf-4.21.7-cp310-abi3-win32.whl", hash = "sha256:c7cb105d69a87416bd9023e64324e1c089593e6dae64d2536f06bcbe49cd97d8"}, + {file = "protobuf-4.21.7-cp310-abi3-win_amd64.whl", hash = "sha256:3ec85328a35a16463c6f419dbce3c0fc42b3e904d966f17f48bae39597c7a543"}, + {file = "protobuf-4.21.7-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:db9056b6a11cb5131036d734bcbf91ef3ef9235d6b681b2fc431cbfe5a7f2e56"}, + {file = "protobuf-4.21.7-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:ca200645d6235ce0df3ccfdff1567acbab35c4db222a97357806e015f85b5744"}, + {file = "protobuf-4.21.7-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:b019c79e23a80735cc8a71b95f76a49a262f579d6b84fd20a0b82279f40e2cc1"}, + {file = "protobuf-4.21.7-cp37-cp37m-win32.whl", hash = "sha256:d3f89ccf7182293feba2de2739c8bf34fed1ed7c65a5cf987be00311acac57c1"}, + {file = "protobuf-4.21.7-cp37-cp37m-win_amd64.whl", hash = "sha256:a74d96cd960b87b4b712797c741bb3ea3a913f5c2dc4b6cbe9c0f8360b75297d"}, + {file = "protobuf-4.21.7-cp38-cp38-win32.whl", hash = "sha256:8e09d1916386eca1ef1353767b6efcebc0a6859ed7f73cb7fb974feba3184830"}, + {file = "protobuf-4.21.7-cp38-cp38-win_amd64.whl", hash = "sha256:9e355f2a839d9930d83971b9f562395e13493f0e9211520f8913bd11efa53c02"}, + {file = "protobuf-4.21.7-cp39-cp39-win32.whl", hash = "sha256:f370c0a71712f8965023dd5b13277444d3cdfecc96b2c778b0e19acbfd60df6e"}, + {file = "protobuf-4.21.7-cp39-cp39-win_amd64.whl", hash = "sha256:9643684232b6b340b5e63bb69c9b4904cdd39e4303d498d1a92abddc7e895b7f"}, + {file = "protobuf-4.21.7-py2.py3-none-any.whl", hash = "sha256:8066322588d4b499869bf9f665ebe448e793036b552f68c585a9b28f1e393f66"}, + {file = "protobuf-4.21.7-py3-none-any.whl", hash = "sha256:58b81358ec6c0b5d50df761460ae2db58405c063fd415e1101209221a0a810e1"}, + {file = "protobuf-4.21.7.tar.gz", hash = "sha256:71d9dba03ed3432c878a801e2ea51e034b0ea01cf3a4344fb60166cb5f6c8757"}, ] psycopg2-binary = [ {file = "psycopg2-binary-2.9.1.tar.gz", hash = "sha256:b0221ca5a9837e040ebf61f48899926b5783668b7807419e4adae8175a31f773"}, @@ -1773,42 +1664,28 @@ pycryptodomex = [ {file = "pycryptodomex-3.14.1.tar.gz", hash = "sha256:2ce76ed0081fd6ac8c74edc75b9d14eca2064173af79843c24fa62573263c1f2"}, ] pydantic = [ - {file = "pydantic-1.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd"}, - {file = "pydantic-1.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912"}, - {file = "pydantic-1.10.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236"}, - {file = "pydantic-1.10.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c"}, - {file = "pydantic-1.10.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f"}, - {file = "pydantic-1.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525"}, - {file = "pydantic-1.10.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42"}, - {file = "pydantic-1.10.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52"}, - {file = "pydantic-1.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c"}, - {file = "pydantic-1.10.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c"}, - {file = "pydantic-1.10.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5"}, - {file = "pydantic-1.10.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d"}, - {file = "pydantic-1.10.2-cp37-cp37m-win_amd64.whl", hash = "sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13"}, - {file = "pydantic-1.10.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624"}, - {file = "pydantic-1.10.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9"}, - {file = "pydantic-1.10.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965"}, - {file = "pydantic-1.10.2-cp38-cp38-win_amd64.whl", hash = "sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488"}, - {file = "pydantic-1.10.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b"}, - {file = "pydantic-1.10.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d"}, - {file = "pydantic-1.10.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda"}, - {file = "pydantic-1.10.2-cp39-cp39-win_amd64.whl", hash = "sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6"}, - {file = "pydantic-1.10.2-py3-none-any.whl", hash = "sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709"}, - {file = "pydantic-1.10.2.tar.gz", hash = "sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410"}, + {file = "pydantic-1.8.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:05ddfd37c1720c392f4e0d43c484217b7521558302e7069ce8d318438d297739"}, + {file = "pydantic-1.8.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a7c6002203fe2c5a1b5cbb141bb85060cbff88c2d78eccbc72d97eb7022c43e4"}, + {file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:589eb6cd6361e8ac341db97602eb7f354551482368a37f4fd086c0733548308e"}, + {file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:10e5622224245941efc193ad1d159887872776df7a8fd592ed746aa25d071840"}, + {file = "pydantic-1.8.2-cp36-cp36m-win_amd64.whl", hash = "sha256:99a9fc39470010c45c161a1dc584997f1feb13f689ecf645f59bb4ba623e586b"}, + {file = "pydantic-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a83db7205f60c6a86f2c44a61791d993dff4b73135df1973ecd9eed5ea0bda20"}, + {file = "pydantic-1.8.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:41b542c0b3c42dc17da70554bc6f38cbc30d7066d2c2815a94499b5684582ecb"}, + {file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:ea5cb40a3b23b3265f6325727ddfc45141b08ed665458be8c6285e7b85bd73a1"}, + {file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:18b5ea242dd3e62dbf89b2b0ec9ba6c7b5abaf6af85b95a97b00279f65845a23"}, + {file = "pydantic-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:234a6c19f1c14e25e362cb05c68afb7f183eb931dd3cd4605eafff055ebbf287"}, + {file = "pydantic-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:021ea0e4133e8c824775a0cfe098677acf6fa5a3cbf9206a376eed3fc09302cd"}, + {file = "pydantic-1.8.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e710876437bc07bd414ff453ac8ec63d219e7690128d925c6e82889d674bb505"}, + {file = "pydantic-1.8.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:ac8eed4ca3bd3aadc58a13c2aa93cd8a884bcf21cb019f8cfecaae3b6ce3746e"}, + {file = "pydantic-1.8.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:4a03cbbe743e9c7247ceae6f0d8898f7a64bb65800a45cbdc52d65e370570820"}, + {file = "pydantic-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:8621559dcf5afacf0069ed194278f35c255dc1a1385c28b32dd6c110fd6531b3"}, + {file = "pydantic-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8b223557f9510cf0bfd8b01316bf6dd281cf41826607eada99662f5e4963f316"}, + {file = "pydantic-1.8.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:244ad78eeb388a43b0c927e74d3af78008e944074b7d0f4f696ddd5b2af43c62"}, + {file = "pydantic-1.8.2-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:05ef5246a7ffd2ce12a619cbb29f3307b7c4509307b1b49f456657b43529dc6f"}, + {file = "pydantic-1.8.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:54cd5121383f4a461ff7644c7ca20c0419d58052db70d8791eacbbe31528916b"}, + {file = "pydantic-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:4be75bebf676a5f0f87937c6ddb061fa39cbea067240d98e298508c1bda6f3f3"}, + {file = "pydantic-1.8.2-py3-none-any.whl", hash = "sha256:fec866a0b59f372b7e776f2d7308511784dace622e0992a0b59ea3ccee0ae833"}, + {file = "pydantic-1.8.2.tar.gz", hash = "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b"}, ] pyln-bolt7 = [ {file = "pyln-bolt7-1.0.246.tar.gz", hash = "sha256:2b53744fa21c1b12d2c9c9df153651b122e38fa65d4a5c3f2957317ee148e089"}, @@ -1853,13 +1730,9 @@ pytest-cov = [ {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, ] -python-bitcoinlib = [ - {file = "python-bitcoinlib-0.11.2.tar.gz", hash = "sha256:61ba514e0d232cc84741e49862dcedaf37199b40bba252a17edc654f63d13f39"}, - {file = "python_bitcoinlib-0.11.2-py3-none-any.whl", hash = "sha256:78bd4ee717fe805cd760dfdd08765e77b7c7dbef4627f8596285e84953756508"}, -] python-dotenv = [ - {file = "python-dotenv-0.21.0.tar.gz", hash = "sha256:b77d08274639e3d34145dfa6c7008e66df0f04b7be7a75fd0d5292c191d79045"}, - {file = "python_dotenv-0.21.0-py3-none-any.whl", hash = "sha256:1684eb44636dd462b66c3ee016599815514527ad99965de77f43e0944634a7e5"}, + {file = "python-dotenv-0.19.0.tar.gz", hash = "sha256:f521bc2ac9a8e03c736f62911605c5d83970021e3fa95b37d769e2bbbe9b6172"}, + {file = "python_dotenv-0.19.0-py2.py3-none-any.whl", hash = "sha256:aae25dc1ebe97c420f50b81fb0e5c949659af713f31fdb63c749ca68748f34b1"}, ] PyYAML = [ {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, @@ -1896,10 +1769,6 @@ Represent = [ {file = "Represent-1.6.0.post0-py2.py3-none-any.whl", hash = "sha256:99142650756ef1998ce0661568f54a47dac8c638fb27e3816c02536575dbba8c"}, {file = "Represent-1.6.0.post0.tar.gz", hash = "sha256:026c0de2ee8385d1255b9c2426cd4f03fe9177ac94c09979bc601946c8493aa0"}, ] -requests = [ - {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, - {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, -] rfc3986 = [ {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, @@ -1930,8 +1799,8 @@ secp256k1 = [ {file = "secp256k1-0.14.0.tar.gz", hash = "sha256:82c06712d69ef945220c8b53c1a0d424c2ff6a1f64aee609030df79ad8383397"}, ] setuptools = [ - {file = "setuptools-65.6.3-py3-none-any.whl", hash = "sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54"}, - {file = "setuptools-65.6.3.tar.gz", hash = "sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75"}, + {file = "setuptools-65.4.1-py3-none-any.whl", hash = "sha256:1b6bdc6161661409c5f21508763dc63ab20a9ac2f8ba20029aaaa7fdb9118012"}, + {file = "setuptools-65.4.1.tar.gz", hash = "sha256:3050e338e5871e70c72983072fe34f6032ae1cdeeeb67338199c2f74e083a80e"}, ] shortuuid = [ {file = "shortuuid-1.0.1-py3-none-any.whl", hash = "sha256:492c7402ff91beb1342a5898bd61ea953985bf24a41cd9f247409aa2e03c8f77"}, @@ -1942,44 +1811,48 @@ six = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] sniffio = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, + {file = "sniffio-1.2.0-py3-none-any.whl", hash = "sha256:471b71698eac1c2112a40ce2752bb2f4a4814c22a54a3eed3676bc0f5ca9f663"}, + {file = "sniffio-1.2.0.tar.gz", hash = "sha256:c4666eecec1d3f50960c6bdf61ab7bc350648da6c126e3cf6898d8cd4ddcd3de"}, ] SQLAlchemy = [ - {file = "SQLAlchemy-1.3.24-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:87a2725ad7d41cd7376373c15fd8bf674e9c33ca56d0b8036add2d634dba372e"}, - {file = "SQLAlchemy-1.3.24-cp27-cp27m-win32.whl", hash = "sha256:f597a243b8550a3a0b15122b14e49d8a7e622ba1c9d29776af741f1845478d79"}, - {file = "SQLAlchemy-1.3.24-cp27-cp27m-win_amd64.whl", hash = "sha256:fc4cddb0b474b12ed7bdce6be1b9edc65352e8ce66bc10ff8cbbfb3d4047dbf4"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:f1149d6e5c49d069163e58a3196865e4321bad1803d7886e07d8710de392c548"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:14f0eb5db872c231b20c18b1e5806352723a3a89fb4254af3b3e14f22eaaec75"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:e98d09f487267f1e8d1179bf3b9d7709b30a916491997137dd24d6ae44d18d79"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:fc1f2a5a5963e2e73bac4926bdaf7790c4d7d77e8fc0590817880e22dd9d0b8b"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-win32.whl", hash = "sha256:f3c5c52f7cb8b84bfaaf22d82cb9e6e9a8297f7c2ed14d806a0f5e4d22e83fb7"}, - {file = "SQLAlchemy-1.3.24-cp35-cp35m-win_amd64.whl", hash = "sha256:0352db1befcbed2f9282e72843f1963860bf0e0472a4fa5cf8ee084318e0e6ab"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:2ed6343b625b16bcb63c5b10523fd15ed8934e1ed0f772c534985e9f5e73d894"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:34fcec18f6e4b24b4a5f6185205a04f1eab1e56f8f1d028a2a03694ebcc2ddd4"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e47e257ba5934550d7235665eee6c911dc7178419b614ba9e1fbb1ce6325b14f"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:816de75418ea0953b5eb7b8a74933ee5a46719491cd2b16f718afc4b291a9658"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-win32.whl", hash = "sha256:26155ea7a243cbf23287f390dba13d7927ffa1586d3208e0e8d615d0c506f996"}, - {file = "SQLAlchemy-1.3.24-cp36-cp36m-win_amd64.whl", hash = "sha256:f03bd97650d2e42710fbe4cf8a59fae657f191df851fc9fc683ecef10746a375"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:a006d05d9aa052657ee3e4dc92544faae5fcbaafc6128217310945610d862d39"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1e2f89d2e5e3c7a88e25a3b0e43626dba8db2aa700253023b82e630d12b37109"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:0d5d862b1cfbec5028ce1ecac06a3b42bc7703eb80e4b53fceb2738724311443"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:0172423a27fbcae3751ef016663b72e1a516777de324a76e30efa170dbd3dd2d"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-win32.whl", hash = "sha256:d37843fb8df90376e9e91336724d78a32b988d3d20ab6656da4eb8ee3a45b63c"}, - {file = "SQLAlchemy-1.3.24-cp37-cp37m-win_amd64.whl", hash = "sha256:c10ff6112d119f82b1618b6dc28126798481b9355d8748b64b9b55051eb4f01b"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:861e459b0e97673af6cc5e7f597035c2e3acdfb2608132665406cded25ba64c7"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5de2464c254380d8a6c20a2746614d5a436260be1507491442cf1088e59430d2"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d375d8ccd3cebae8d90270f7aa8532fe05908f79e78ae489068f3b4eee5994e8"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:014ea143572fee1c18322b7908140ad23b3994036ef4c0d630110faf942652f8"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-win32.whl", hash = "sha256:6607ae6cd3a07f8a4c3198ffbf256c261661965742e2b5265a77cd5c679c9bba"}, - {file = "SQLAlchemy-1.3.24-cp38-cp38-win_amd64.whl", hash = "sha256:fcb251305fa24a490b6a9ee2180e5f8252915fb778d3dafc70f9cc3f863827b9"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:01aa5f803db724447c1d423ed583e42bf5264c597fd55e4add4301f163b0be48"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4d0e3515ef98aa4f0dc289ff2eebb0ece6260bbf37c2ea2022aad63797eacf60"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:bce28277f308db43a6b4965734366f533b3ff009571ec7ffa583cb77539b84d6"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:8110e6c414d3efc574543109ee618fe2c1f96fa31833a1ff36cc34e968c4f233"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-win32.whl", hash = "sha256:ee5f5188edb20a29c1cc4a039b074fdc5575337c9a68f3063449ab47757bb064"}, - {file = "SQLAlchemy-1.3.24-cp39-cp39-win_amd64.whl", hash = "sha256:09083c2487ca3c0865dc588e07aeaa25416da3d95f7482c07e92f47e080aa17b"}, - {file = "SQLAlchemy-1.3.24.tar.gz", hash = "sha256:ebbb777cbf9312359b897bf81ba00dae0f5cb69fba2a18265dcc18a6f5ef7519"}, + {file = "SQLAlchemy-1.3.23-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:fd3b96f8c705af8e938eaa99cbd8fd1450f632d38cad55e7367c33b263bf98ec"}, + {file = "SQLAlchemy-1.3.23-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:29cccc9606750fe10c5d0e8bd847f17a97f3850b8682aef1f56f5d5e1a5a64b1"}, + {file = "SQLAlchemy-1.3.23-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:927ce09e49bff3104459e1451ce82983b0a3062437a07d883a4c66f0b344c9b5"}, + {file = "SQLAlchemy-1.3.23-cp27-cp27m-win32.whl", hash = "sha256:b4b0e44d586cd64b65b507fa116a3814a1a53d55dce4836d7c1a6eb2823ff8d1"}, + {file = "SQLAlchemy-1.3.23-cp27-cp27m-win_amd64.whl", hash = "sha256:6b8b8c80c7f384f06825612dd078e4a31f0185e8f1f6b8c19e188ff246334205"}, + {file = "SQLAlchemy-1.3.23-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:9e9c25522933e569e8b53ccc644dc993cab87e922fb7e142894653880fdd419d"}, + {file = "SQLAlchemy-1.3.23-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:a0e306e9bb76fd93b29ae3a5155298e4c1b504c7cbc620c09c20858d32d16234"}, + {file = "SQLAlchemy-1.3.23-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:6c9e6cc9237de5660bcddea63f332428bb83c8e2015c26777281f7ffbd2efb84"}, + {file = "SQLAlchemy-1.3.23-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:94f667d86be82dd4cb17d08de0c3622e77ca865320e0b95eae6153faa7b4ecaf"}, + {file = "SQLAlchemy-1.3.23-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:751934967f5336a3e26fc5993ccad1e4fee982029f9317eb6153bc0bc3d2d2da"}, + {file = "SQLAlchemy-1.3.23-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:63677d0c08524af4c5893c18dbe42141de7178001360b3de0b86217502ed3601"}, + {file = "SQLAlchemy-1.3.23-cp35-cp35m-win32.whl", hash = "sha256:ddfb511e76d016c3a160910642d57f4587dc542ce5ee823b0d415134790eeeb9"}, + {file = "SQLAlchemy-1.3.23-cp35-cp35m-win_amd64.whl", hash = "sha256:040bdfc1d76a9074717a3f43455685f781c581f94472b010cd6c4754754e1862"}, + {file = "SQLAlchemy-1.3.23-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:d1a85dfc5dee741bf49cb9b6b6b8d2725a268e4992507cf151cba26b17d97c37"}, + {file = "SQLAlchemy-1.3.23-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:639940bbe1108ac667dcffc79925db2966826c270112e9159439ab6bb14f8d80"}, + {file = "SQLAlchemy-1.3.23-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e8a1750b44ad6422ace82bf3466638f1aa0862dbb9689690d5f2f48cce3476c8"}, + {file = "SQLAlchemy-1.3.23-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e5bb3463df697279e5459a7316ad5a60b04b0107f9392e88674d0ece70e9cf70"}, + {file = "SQLAlchemy-1.3.23-cp36-cp36m-win32.whl", hash = "sha256:e273367f4076bd7b9a8dc2e771978ef2bfd6b82526e80775a7db52bff8ca01dd"}, + {file = "SQLAlchemy-1.3.23-cp36-cp36m-win_amd64.whl", hash = "sha256:ac2244e64485c3778f012951fdc869969a736cd61375fde6096d08850d8be729"}, + {file = "SQLAlchemy-1.3.23-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:23927c3981d1ec6b4ea71eb99d28424b874d9c696a21e5fbd9fa322718be3708"}, + {file = "SQLAlchemy-1.3.23-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d90010304abb4102123d10cbad2cdf2c25a9f2e66a50974199b24b468509bad5"}, + {file = "SQLAlchemy-1.3.23-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a8bfc1e1afe523e94974132d7230b82ca7fa2511aedde1f537ec54db0399541a"}, + {file = "SQLAlchemy-1.3.23-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:269990b3ab53cb035d662dcde51df0943c1417bdab707dc4a7e4114a710504b4"}, + {file = "SQLAlchemy-1.3.23-cp37-cp37m-win32.whl", hash = "sha256:fdd2ed7395df8ac2dbb10cefc44737b66c6a5cd7755c92524733d7a443e5b7e2"}, + {file = "SQLAlchemy-1.3.23-cp37-cp37m-win_amd64.whl", hash = "sha256:6a939a868fdaa4b504e8b9d4a61f21aac11e3fecc8a8214455e144939e3d2aea"}, + {file = "SQLAlchemy-1.3.23-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:24f9569e82a009a09ce2d263559acb3466eba2617203170e4a0af91e75b4f075"}, + {file = "SQLAlchemy-1.3.23-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2578dbdbe4dbb0e5126fb37ffcd9793a25dcad769a95f171a2161030bea850ff"}, + {file = "SQLAlchemy-1.3.23-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:1fe5d8d39118c2b018c215c37b73fd6893c3e1d4895be745ca8ff6eb83333ed3"}, + {file = "SQLAlchemy-1.3.23-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:c7dc052432cd5d060d7437e217dd33c97025287f99a69a50e2dc1478dd610d64"}, + {file = "SQLAlchemy-1.3.23-cp38-cp38-win32.whl", hash = "sha256:ecce8c021894a77d89808222b1ff9687ad84db54d18e4bd0500ca766737faaf6"}, + {file = "SQLAlchemy-1.3.23-cp38-cp38-win_amd64.whl", hash = "sha256:37b83bf81b4b85dda273aaaed5f35ea20ad80606f672d94d2218afc565fb0173"}, + {file = "SQLAlchemy-1.3.23-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:8be835aac18ec85351385e17b8665bd4d63083a7160a017bef3d640e8e65cadb"}, + {file = "SQLAlchemy-1.3.23-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6ec1044908414013ebfe363450c22f14698803ce97fbb47e53284d55c5165848"}, + {file = "SQLAlchemy-1.3.23-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:eab063a70cca4a587c28824e18be41d8ecc4457f8f15b2933584c6c6cccd30f0"}, + {file = "SQLAlchemy-1.3.23-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:baeb451ee23e264de3f577fee5283c73d9bbaa8cb921d0305c0bbf700094b65b"}, + {file = "SQLAlchemy-1.3.23-cp39-cp39-win32.whl", hash = "sha256:94208867f34e60f54a33a37f1c117251be91a47e3bfdb9ab8a7847f20886ad06"}, + {file = "SQLAlchemy-1.3.23-cp39-cp39-win_amd64.whl", hash = "sha256:f4d972139d5000105fcda9539a76452039434013570d6059993120dc2a65e447"}, + {file = "SQLAlchemy-1.3.23.tar.gz", hash = "sha256:6fca33672578666f657c131552c4ef8979c1606e494f78cd5199742dfb26918b"}, ] sqlalchemy-aio = [ {file = "sqlalchemy_aio-0.17.0-py3-none-any.whl", hash = "sha256:3f4aa392c38f032d6734826a4138a0f02ed3122d442ed142be1e5964f2a33b60"}, @@ -2023,20 +1896,17 @@ typed-ast = [ {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, ] types-protobuf = [ - {file = "types-protobuf-3.20.4.6.tar.gz", hash = "sha256:ba27443c592bbec1629dd69494a24c84461c63f0d3b7d648ce258aaae9680965"}, - {file = "types_protobuf-3.20.4.6-py3-none-any.whl", hash = "sha256:ab2d315ba82246b83d28f8797c98dc0fe1dd5cfd187909e56faf87239aedaae3"}, + {file = "types-protobuf-3.20.4.tar.gz", hash = "sha256:0dad3a5009895c985a56e2837f61902bad9594151265ac0ee907bb16d0b01eb7"}, + {file = "types_protobuf-3.20.4-py3-none-any.whl", hash = "sha256:5082437afe64ce3b31c8db109eae86e02fda11e4d5f9ac59cb8578a8a138aa70"}, ] typing-extensions = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, -] -urllib3 = [ - {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, - {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, + {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, + {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, + {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, ] uvicorn = [ - {file = "uvicorn-0.18.3-py3-none-any.whl", hash = "sha256:0abd429ebb41e604ed8d2be6c60530de3408f250e8d2d84967d85ba9e86fe3af"}, - {file = "uvicorn-0.18.3.tar.gz", hash = "sha256:9a66e7c42a2a95222f76ec24a4b754c158261c4696e683b9dadc72b590e0311b"}, + {file = "uvicorn-0.18.1-py3-none-any.whl", hash = "sha256:013c4ea0787cc2dc456ef4368e18c01982e6be57903e4d3183218e543eb889b7"}, + {file = "uvicorn-0.18.1.tar.gz", hash = "sha256:35703e6518105cfe53f16a5a9435db3e2e227d0784f1fd8fbc1214b1fdc108df"}, ] uvloop = [ {file = "uvloop-0.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6224f1401025b748ffecb7a6e2652b17768f30b1a6a3f7b44660e5b5b690b12d"}, @@ -2096,6 +1966,6 @@ win32-setctime = [ {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, ] zipp = [ - {file = "zipp-3.9.0-py3-none-any.whl", hash = "sha256:972cfa31bc2fedd3fa838a51e9bc7e64b7fb725a8c00e7431554311f180e9980"}, - {file = "zipp-3.9.0.tar.gz", hash = "sha256:3a7af91c3db40ec72dd9d154ae18e008c69efe8ca88dde4f9a731bb82fe2f9eb"}, + {file = "zipp-3.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"}, + {file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"}, ] diff --git a/pyproject.toml b/pyproject.toml index 5bd685b1..e66073c5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,60 +12,58 @@ script = "build.py" python = "^3.10 | ^3.9 | ^3.8 | ^3.7" aiofiles = "0.8.0" asgiref = "3.4.1" -attrs = "22.1.0" +attrs = "21.2.0" bech32 = "1.2.0" bitstring = "3.1.9" -certifi = "2022.9.24" -charset-normalizer = "2.0.12" -click = "8.0.4" -ecdsa = "0.18.0" +certifi = "2021.5.30" +charset-normalizer = "2.0.6" +click = "8.0.1" +ecdsa = "0.17.0" embit = "0.4.9" -environs = "9.5.0" -fastapi = "0.83.0" +environs = "9.3.3" +fastapi = "0.78.0" h11 = "0.12.0" httpcore = "0.15.0" httptools = "0.4.0" httpx = "0.23.0" -idna = "3.4" -importlib-metadata = "5.0.0" +idna = "3.2" +importlib-metadata = "4.8.1" jinja2 = "3.0.1" lnurl = "0.3.6" markupsafe = "2.0.1" -marshmallow = "3.18.0" -outcome = "1.2.0" +marshmallow = "3.17.0" +outcome = "1.1.0" psycopg2-binary = "2.9.1" pycryptodomex = "3.14.1" -pydantic = "1.10.2" +pydantic = "1.8.2" pypng = "0.0.21" pyqrcode = "1.2.1" pyScss = "1.4.0" -python-dotenv = "0.21.0" +python-dotenv = "0.19.0" pyyaml = "5.4.1" represent = "1.6.0.post0" rfc3986 = "1.5.0" secp256k1 = "0.14.0" shortuuid = "1.0.1" six = "1.16.0" -sniffio = "1.3.0" -sqlalchemy = "1.3.24" +sniffio = "1.2.0" +sqlalchemy = "1.3.23" sqlalchemy-aio = "0.17.0" sse-starlette = "0.6.2" -typing-extensions = "^4.4.0" -uvicorn = "0.18.3" +typing-extensions = "3.10.0.2" +uvicorn = "0.18.1" uvloop = "0.16.0" watchgod = "0.7" websockets = "10.0" -zipp = "3.9.0" -loguru = "0.6.0" -cffi = "1.15.1" +zipp = "3.5.0" +loguru = "0.5.3" +cffi = "1.15.0" websocket-client = "1.3.3" grpcio = "^1.49.1" protobuf = "^4.21.6" Cerberus = "^1.3.4" async-timeout = "^4.0.2" pyln-client = "0.11.1" -cashu = "0.5.4" - [tool.poetry.dev-dependencies] isort = "^5.10.1" diff --git a/requirements.txt b/requirements.txt index 06e8642f..eb9a6e5e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,82 +1,55 @@ -aiofiles==0.8.0 ; python_version >= "3.7" and python_version < "4.0" -anyio==3.6.2 ; python_version >= "3.7" and python_version < "4.0" -asgiref==3.4.1 ; python_version >= "3.7" and python_version < "4.0" -asn1crypto==1.5.1 ; python_version >= "3.7" and python_version < "4.0" -async-timeout==4.0.2 ; python_version >= "3.7" and python_version < "4.0" -attrs==22.1.0 ; python_version >= "3.7" and python_version < "4.0" -base58==2.1.1 ; python_version >= "3.7" and python_version < "4.0" -bech32==1.2.0 ; python_version >= "3.7" and python_version < "4.0" -bitstring==3.1.9 ; python_version >= "3.7" and python_version < "4.0" -cashu==0.5.4 ; python_version >= "3.7" and python_version < "4.0" -cerberus==1.3.4 ; python_version >= "3.7" and python_version < "4.0" -certifi==2022.9.24 ; python_version >= "3.7" and python_version < "4.0" -cffi==1.15.1 ; python_version >= "3.7" and python_version < "4.0" -charset-normalizer==2.0.12 ; python_version >= "3.7" and python_version < "4.0" -click==8.0.4 ; python_version >= "3.7" and python_version < "4.0" -coincurve==17.0.0 ; python_version >= "3.7" and python_version < "4.0" -colorama==0.4.5 ; python_version >= "3.7" and python_version < "4.0" and platform_system == "Windows" or python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" -cryptography==36.0.2 ; python_version >= "3.7" and python_version < "4.0" -ecdsa==0.18.0 ; python_version >= "3.7" and python_version < "4.0" -embit==0.4.9 ; python_version >= "3.7" and python_version < "4.0" -enum34==1.1.10 ; python_version >= "3.7" and python_version < "4.0" -environs==9.5.0 ; python_version >= "3.7" and python_version < "4.0" -fastapi==0.83.0 ; python_version >= "3.7" and python_version < "4.0" -grpcio==1.50.0 ; python_version >= "3.7" and python_version < "4.0" -h11==0.12.0 ; python_version >= "3.7" and python_version < "4.0" -httpcore==0.15.0 ; python_version >= "3.7" and python_version < "4.0" -httptools==0.4.0 ; python_version >= "3.7" and python_version < "4.0" -httpx==0.23.0 ; python_version >= "3.7" and python_version < "4.0" -idna==3.4 ; python_version >= "3.7" and python_version < "4.0" -importlib-metadata==5.0.0 ; python_version >= "3.7" and python_version < "4.0" -iniconfig==1.1.1 ; python_version >= "3.7" and python_version < "4.0" -jinja2==3.0.1 ; python_version >= "3.7" and python_version < "4.0" -lnurl==0.3.6 ; python_version >= "3.7" and python_version < "4.0" -loguru==0.6.0 ; python_version >= "3.7" and python_version < "4.0" -markupsafe==2.0.1 ; python_version >= "3.7" and python_version < "4.0" -marshmallow==3.18.0 ; python_version >= "3.7" and python_version < "4.0" -outcome==1.2.0 ; python_version >= "3.7" and python_version < "4.0" -packaging==21.3 ; python_version >= "3.7" and python_version < "4.0" -pathlib2==2.3.7.post1 ; python_version >= "3.7" and python_version < "4.0" -pluggy==1.0.0 ; python_version >= "3.7" and python_version < "4.0" -protobuf==4.21.9 ; python_version >= "3.7" and python_version < "4.0" -psycopg2-binary==2.9.1 ; python_version >= "3.7" and python_version < "4.0" -py==1.11.0 ; python_version >= "3.7" and python_version < "4.0" -pycparser==2.21 ; python_version >= "3.7" and python_version < "4.0" -pycryptodomex==3.14.1 ; python_version >= "3.7" and python_version < "4.0" -pydantic==1.10.2 ; python_version >= "3.7" and python_version < "4.0" -pyln-bolt7==1.0.246 ; python_version >= "3.7" and python_version < "4.0" -pyln-client==0.11.1 ; python_version >= "3.7" and python_version < "4.0" -pyln-proto==0.11.1 ; python_version >= "3.7" and python_version < "4.0" -pyparsing==3.0.9 ; python_version >= "3.7" and python_version < "4.0" -pypng==0.0.21 ; python_version >= "3.7" and python_version < "4.0" -pyqrcode==1.2.1 ; python_version >= "3.7" and python_version < "4.0" -pyscss==1.4.0 ; python_version >= "3.7" and python_version < "4.0" -pysocks==1.7.1 ; python_version >= "3.7" and python_version < "4.0" -pytest-asyncio==0.19.0 ; python_version >= "3.7" and python_version < "4.0" -pytest==7.1.3 ; python_version >= "3.7" and python_version < "4.0" -python-bitcoinlib==0.11.2 ; python_version >= "3.7" and python_version < "4.0" -python-dotenv==0.21.0 ; python_version >= "3.7" and python_version < "4.0" -pyyaml==5.4.1 ; python_version >= "3.7" and python_version < "4.0" -represent==1.6.0.post0 ; python_version >= "3.7" and python_version < "4.0" -requests==2.27.1 ; python_version >= "3.7" and python_version < "4.0" -rfc3986==1.5.0 ; python_version >= "3.7" and python_version < "4.0" -rfc3986[idna2008]==1.5.0 ; python_version >= "3.7" and python_version < "4.0" -secp256k1==0.14.0 ; python_version >= "3.7" and python_version < "4.0" -setuptools==65.6.3 ; python_version >= "3.7" and python_version < "4.0" -shortuuid==1.0.1 ; python_version >= "3.7" and python_version < "4.0" -six==1.16.0 ; python_version >= "3.7" and python_version < "4.0" -sniffio==1.3.0 ; python_version >= "3.7" and python_version < "4.0" -sqlalchemy-aio==0.17.0 ; python_version >= "3.7" and python_version < "4.0" -sqlalchemy==1.3.24 ; python_version >= "3.7" and python_version < "4.0" -sse-starlette==0.6.2 ; python_version >= "3.7" and python_version < "4.0" -starlette==0.19.1 ; python_version >= "3.7" and python_version < "4.0" -tomli==2.0.1 ; python_version >= "3.7" and python_version < "4.0" -typing-extensions==4.4.0 ; python_version >= "3.7" and python_version < "4.0" -urllib3==1.26.12 ; python_version >= "3.7" and python_version < "4" -uvicorn==0.18.3 ; python_version >= "3.7" and python_version < "4.0" -uvloop==0.16.0 ; python_version >= "3.7" and python_version < "4.0" -watchgod==0.7 ; python_version >= "3.7" and python_version < "4.0" -websocket-client==1.3.3 ; python_version >= "3.7" and python_version < "4.0" -websockets==10.0 ; python_version >= "3.7" and python_version < "4.0" -win32-setctime==1.1.0 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" -zipp==3.9.0 ; python_version >= "3.7" and python_version < "4.0" +aiofiles==0.8.0 +anyio==3.6.1 +asyncio==3.4.3 +attrs==21.4.0 +bech32==1.2.0 +bitstring==3.1.9 +cerberus==1.3.4 +certifi==2022.6.15 +cffi==1.15.0 +click==8.1.3 +ecdsa==0.18.0 +embit==0.5.0 +environs==9.5.0 +fastapi==0.79.0 +h11==0.12.0 +httpcore==0.15.0 +httptools==0.4.0 +httpx==0.23.0 +idna==3.3 +jinja2==3.0.1 +lnurl==0.3.6 +loguru==0.6.0 +markupsafe==2.1.1 +marshmallow==3.17.0 +outcome==1.2.0 +packaging==21.3 +psycopg2-binary==2.9.3 +pycparser==2.21 +pycryptodomex==3.15.0 +pydantic==1.9.1 +pyngrok==5.1.0 +pyparsing==3.0.9 +pypng==0.20220715.0 +pyqrcode==1.2.1 +pyscss==1.4.0 +python-dotenv==0.20.0 +pyyaml==6.0 +represent==1.6.0.post0 +rfc3986==1.5.0 +secp256k1==0.14.0 +shortuuid==1.0.9 +six==1.16.0 +sniffio==1.2.0 +sqlalchemy-aio==0.17.0 +sqlalchemy==1.3.23 +sse-starlette==0.10.3 +starlette==0.19.1 +typing-extensions==4.3.0 +uvicorn==0.18.2 +uvloop==0.16.0 +watchfiles==0.16.0 +websockets==10.3 +websocket-client==1.3.3 +async-timeout==4.0.2 +setuptools==65.4.0 \ No newline at end of file diff --git a/tests/data/mock_data.zip b/tests/data/mock_data.zip index e992b988..5a52941c 100644 Binary files a/tests/data/mock_data.zip and b/tests/data/mock_data.zip differ diff --git a/tools/conv.py b/tools/conv.py index f483ae1a..541a0b75 100644 --- a/tools/conv.py +++ b/tools/conv.py @@ -133,10 +133,6 @@ def migrate_db(file: str, schema: str, exclude_tables: List[str] = []): for table in tables: tableName = table[0] - print(f"Migrating table {tableName}") - # hard coded skip for dbversions (already produced during startup) - if tableName == "dbversions": - continue if tableName in exclude_tables: continue @@ -160,7 +156,7 @@ def build_insert_query(schema, tableName, columns): def to_column_type(columnType): if columnType == "TIMESTAMP": return "to_timestamp(%s)" - if columnType in ["BOOLEAN", "BOOL"]: + if columnType == "BOOLEAN": return "%s::boolean" return "%s"