mirror of
https://github.com/aljazceru/nutshell.git
synced 2025-12-24 03:54:21 +01:00
Multinut LND (#492)
* amount in melt request * apply fee limit * more error handling * wip: signal flag in /info * clean up multinut * decode mypy error lndrest * fix test * fix tests * signal feature and blindmessages_deprecated * setting * fix blindedsignature method * fix tests * mint info file * test mpp with lnd regtest * nuts optionsl mint info * try to enable mpp with lnd * test mpp with third payment
This commit is contained in:
@@ -161,13 +161,18 @@ class Proof(BaseModel):
|
||||
return HTLCWitness.from_witness(self.witness).preimage
|
||||
|
||||
|
||||
class Proofs(BaseModel):
|
||||
# NOTE: not used in Pydantic validation
|
||||
__root__: List[Proof]
|
||||
|
||||
|
||||
class BlindedMessage(BaseModel):
|
||||
"""
|
||||
Blinded message or blinded secret or "output" which is to be signed by the mint
|
||||
"""
|
||||
|
||||
amount: int
|
||||
id: str
|
||||
id: str # Keyset id
|
||||
B_: str # Hex-encoded blinded message
|
||||
witness: Union[str, None] = None # witnesses (used for P2PK with SIG_ALL)
|
||||
|
||||
@@ -177,6 +182,28 @@ class BlindedMessage(BaseModel):
|
||||
return P2PKWitness.from_witness(self.witness).signatures
|
||||
|
||||
|
||||
class BlindedMessage_Deprecated(BaseModel):
|
||||
"""
|
||||
Deprecated: BlindedMessage for v0 protocol (deprecated api routes) have no id field.
|
||||
|
||||
Blinded message or blinded secret or "output" which is to be signed by the mint
|
||||
"""
|
||||
|
||||
amount: int
|
||||
B_: str # Hex-encoded blinded message
|
||||
witness: Union[str, None] = None # witnesses (used for P2PK with SIG_ALL)
|
||||
|
||||
@property
|
||||
def p2pksigs(self) -> List[str]:
|
||||
assert self.witness, "Witness missing in output"
|
||||
return P2PKWitness.from_witness(self.witness).signatures
|
||||
|
||||
|
||||
class BlindedMessages(BaseModel):
|
||||
# NOTE: not used in Pydantic validation
|
||||
__root__: List[BlindedMessage] = []
|
||||
|
||||
|
||||
class BlindedSignature(BaseModel):
|
||||
"""
|
||||
Blinded signature or "promise" which is the signature on a `BlindedMessage`
|
||||
@@ -314,7 +341,13 @@ class GetInfoResponse(BaseModel):
|
||||
description_long: Optional[str] = None
|
||||
contact: Optional[List[List[str]]] = None
|
||||
motd: Optional[str] = None
|
||||
nuts: Optional[Dict[int, Dict[str, Any]]] = None
|
||||
nuts: Optional[Dict[int, Any]] = None
|
||||
|
||||
|
||||
class Nut15MppSupport(BaseModel):
|
||||
method: str
|
||||
unit: str
|
||||
mpp: bool
|
||||
|
||||
|
||||
class GetInfoResponse_deprecated(BaseModel):
|
||||
@@ -329,19 +362,6 @@ class GetInfoResponse_deprecated(BaseModel):
|
||||
parameter: Optional[dict] = None
|
||||
|
||||
|
||||
class BlindedMessage_Deprecated(BaseModel):
|
||||
# Same as BlindedMessage, but without the id field
|
||||
amount: int
|
||||
B_: str # Hex-encoded blinded message
|
||||
id: Optional[str] = None
|
||||
witness: Union[str, None] = None # witnesses (used for P2PK with SIG_ALL)
|
||||
|
||||
@property
|
||||
def p2pksigs(self) -> List[str]:
|
||||
assert self.witness, "Witness missing in output"
|
||||
return P2PKWitness.from_witness(self.witness).signatures
|
||||
|
||||
|
||||
# ------- API: KEYS -------
|
||||
|
||||
|
||||
@@ -425,6 +445,7 @@ class PostMeltQuoteRequest(BaseModel):
|
||||
request: str = Field(
|
||||
..., max_length=settings.mint_max_request_length
|
||||
) # output payment request
|
||||
amount: Optional[int] = Field(default=None, gt=0) # input amount
|
||||
|
||||
|
||||
class PostMeltQuoteResponse(BaseModel):
|
||||
@@ -551,6 +572,12 @@ class PostRestoreRequest(BaseModel):
|
||||
)
|
||||
|
||||
|
||||
class PostRestoreRequest_Deprecated(BaseModel):
|
||||
outputs: List[BlindedMessage_Deprecated] = Field(
|
||||
..., max_items=settings.mint_max_request_length
|
||||
)
|
||||
|
||||
|
||||
class PostRestoreResponse(BaseModel):
|
||||
outputs: List[BlindedMessage] = []
|
||||
signatures: List[BlindedSignature] = []
|
||||
@@ -656,6 +683,7 @@ class WalletKeyset:
|
||||
valid_to=None,
|
||||
first_seen=None,
|
||||
active=True,
|
||||
use_deprecated_id=False, # BACKWARDS COMPATIBILITY < 0.15.0
|
||||
):
|
||||
self.valid_from = valid_from
|
||||
self.valid_to = valid_to
|
||||
@@ -670,10 +698,19 @@ class WalletKeyset:
|
||||
else:
|
||||
self.id = id
|
||||
|
||||
# BEGIN BACKWARDS COMPATIBILITY < 0.15.0
|
||||
if use_deprecated_id:
|
||||
logger.warning(
|
||||
"Using deprecated keyset id derivation for backwards compatibility <"
|
||||
" 0.15.0"
|
||||
)
|
||||
self.id = derive_keyset_id_deprecated(self.public_keys)
|
||||
# END BACKWARDS COMPATIBILITY < 0.15.0
|
||||
|
||||
self.unit = Unit[unit]
|
||||
|
||||
logger.trace(f"Derived keyset id {self.id} from public keys.")
|
||||
if id and id != self.id:
|
||||
if id and id != self.id and use_deprecated_id:
|
||||
logger.warning(
|
||||
f"WARNING: Keyset id {self.id} does not match the given id {id}."
|
||||
" Overwriting."
|
||||
@@ -728,6 +765,8 @@ class MintKeyset:
|
||||
first_seen: Optional[str] = None
|
||||
version: Optional[str] = None
|
||||
|
||||
duplicate_keyset_id: Optional[str] = None # BACKWARDS COMPATIBILITY < 0.15.0
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
@@ -808,12 +847,6 @@ class MintKeyset:
|
||||
assert self.seed, "seed not set"
|
||||
assert self.derivation_path, "derivation path not set"
|
||||
|
||||
# we compute the keyset id from the public keys only if it is not
|
||||
# loaded from the database. This is to allow for backwards compatibility
|
||||
# with old keysets with new id's and vice versa. This code can be removed
|
||||
# if there are only new keysets in the mint (> 0.15.0)
|
||||
id_in_db = self.id
|
||||
|
||||
if self.version_tuple < (0, 12):
|
||||
# WARNING: Broken key derivation for backwards compatibility with < 0.12
|
||||
self.private_keys = derive_keys_backwards_compatible_insecure_pre_0_12(
|
||||
@@ -824,8 +857,7 @@ class MintKeyset:
|
||||
f"WARNING: Using weak key derivation for keyset {self.id} (backwards"
|
||||
" compatibility < 0.12)"
|
||||
)
|
||||
# load from db or derive
|
||||
self.id = id_in_db or derive_keyset_id_deprecated(self.public_keys) # type: ignore
|
||||
self.id = derive_keyset_id_deprecated(self.public_keys) # type: ignore
|
||||
elif self.version_tuple < (0, 15):
|
||||
self.private_keys = derive_keys_sha256(self.seed, self.derivation_path)
|
||||
logger.trace(
|
||||
@@ -833,13 +865,11 @@ class MintKeyset:
|
||||
" compatibility < 0.15)"
|
||||
)
|
||||
self.public_keys = derive_pubkeys(self.private_keys) # type: ignore
|
||||
# load from db or derive
|
||||
self.id = id_in_db or derive_keyset_id_deprecated(self.public_keys) # type: ignore
|
||||
self.id = derive_keyset_id_deprecated(self.public_keys) # type: ignore
|
||||
else:
|
||||
self.private_keys = derive_keys(self.seed, self.derivation_path)
|
||||
self.public_keys = derive_pubkeys(self.private_keys) # type: ignore
|
||||
# load from db or derive
|
||||
self.id = id_in_db or derive_keyset_id(self.public_keys) # type: ignore
|
||||
self.id = derive_keyset_id(self.public_keys) # type: ignore
|
||||
|
||||
|
||||
# ------- TOKEN -------
|
||||
|
||||
Reference in New Issue
Block a user