mirror of
https://github.com/aljazceru/nutshell.git
synced 2025-12-21 19:14:19 +01:00
With the recent update to NUT-08, we can ensure that the amount of blank outputs is always enough to cover any overpaid lightning fees. This change implements this functionality for both the wallet and the mint. The mint updateis backwards-compatible with respect to old wallets.
56 lines
1.5 KiB
Python
56 lines
1.5 KiB
Python
import asyncio
|
|
import math
|
|
from functools import partial, wraps
|
|
from typing import List
|
|
|
|
from ..core.base import Proof
|
|
from ..core.settings import settings
|
|
|
|
|
|
def sum_proofs(proofs: List[Proof]):
|
|
return sum([p.amount for p in proofs])
|
|
|
|
|
|
def async_wrap(func):
|
|
@wraps(func)
|
|
async def run(*args, loop=None, executor=None, **kwargs):
|
|
if loop is None:
|
|
loop = asyncio.get_event_loop()
|
|
partial_func = partial(func, *args, **kwargs)
|
|
return await loop.run_in_executor(executor, partial_func)
|
|
|
|
return run
|
|
|
|
|
|
def async_unwrap(to_await):
|
|
async_response = []
|
|
|
|
async def run_and_capture_result():
|
|
r = await to_await
|
|
async_response.append(r)
|
|
|
|
loop = asyncio.get_event_loop()
|
|
coroutine = run_and_capture_result()
|
|
loop.run_until_complete(coroutine)
|
|
return async_response[0]
|
|
|
|
|
|
def fee_reserve(amount_msat: int, internal=False) -> int:
|
|
"""Function for calculating the Lightning fee reserve"""
|
|
if internal:
|
|
return 0
|
|
return max(
|
|
int(settings.lightning_reserve_fee_min),
|
|
int(amount_msat * settings.lightning_fee_percent / 100.0),
|
|
)
|
|
|
|
|
|
def calculate_number_of_blank_outputs(fee_reserve_sat: int):
|
|
"""Calculates the number of blank outputs used for returning overpaid fees.
|
|
|
|
The formula ensures that any overpaid fees can be represented by the blank outputs,
|
|
see NUT-08 for details.
|
|
"""
|
|
assert fee_reserve_sat > 0, "Fee reserve has to be positive."
|
|
return max(math.ceil(math.log2(fee_reserve_sat)), 1)
|