lnworker: if trampoline is active, make num_sats_can_send
return the max value allowed for legacy payments.
(that is, do not assume we can do MPP involving two trampolines)
This reverts fb6047ec46
Reason: num_sats_can_send may be used to decide the amount
we put in a new channel.
This commit is contained in:
@@ -1096,37 +1096,7 @@ class LNWallet(LNWorker):
|
|||||||
|
|
||||||
def can_pay_invoice(self, invoice: Invoice) -> bool:
|
def can_pay_invoice(self, invoice: Invoice) -> bool:
|
||||||
assert invoice.is_lightning()
|
assert invoice.is_lightning()
|
||||||
if invoice.get_amount_sat() > self.num_sats_can_send():
|
return invoice.get_amount_sat() <= self.num_sats_can_send()
|
||||||
return False
|
|
||||||
# if we dont find a path because of unsynchronized DB, this method should not return False
|
|
||||||
if self.channel_db:
|
|
||||||
return True
|
|
||||||
# trampoline nodes currently cannot do legacy payments over multiple nodes
|
|
||||||
# we call create_routes_for_payment in order to find out
|
|
||||||
lnaddr = self._check_invoice(invoice.lightning_invoice, amount_msat=invoice.get_amount_msat())
|
|
||||||
min_cltv_expiry = lnaddr.get_min_final_cltv_expiry()
|
|
||||||
invoice_pubkey = lnaddr.pubkey.serialize()
|
|
||||||
invoice_features = lnaddr.get_features()
|
|
||||||
r_tags = lnaddr.get_routing_info('r')
|
|
||||||
amount_to_pay = lnaddr.get_amount_msat()
|
|
||||||
try:
|
|
||||||
routes = self.create_routes_for_payment(
|
|
||||||
amount_msat=amount_to_pay,
|
|
||||||
final_total_msat=amount_to_pay,
|
|
||||||
invoice_pubkey=invoice_pubkey,
|
|
||||||
min_cltv_expiry=min_cltv_expiry,
|
|
||||||
r_tags=r_tags,
|
|
||||||
invoice_features=invoice_features,
|
|
||||||
full_path=None,
|
|
||||||
payment_hash=bytes(32),
|
|
||||||
payment_secret=bytes(32),
|
|
||||||
trampoline_fee_level=self.INITIAL_TRAMPOLINE_FEE_LEVEL,
|
|
||||||
use_two_trampolines=False,
|
|
||||||
fwd_trampoline_onion=None
|
|
||||||
)
|
|
||||||
return True
|
|
||||||
except NoPathFound:
|
|
||||||
return False
|
|
||||||
|
|
||||||
@log_exceptions
|
@log_exceptions
|
||||||
async def pay_invoice(
|
async def pay_invoice(
|
||||||
@@ -2094,12 +2064,18 @@ class LNWallet(LNWorker):
|
|||||||
for chan in self.channels.values())) / 1000
|
for chan in self.channels.values())) / 1000
|
||||||
|
|
||||||
def num_sats_can_send(self) -> Decimal:
|
def num_sats_can_send(self) -> Decimal:
|
||||||
can_send = 0
|
can_send_dict = defaultdict(int)
|
||||||
with self.lock:
|
with self.lock:
|
||||||
if self.channels:
|
if self.channels:
|
||||||
for c in self.channels.values():
|
for c in self.channels.values():
|
||||||
if c.is_active() and not c.is_frozen_for_sending():
|
if c.is_active() and not c.is_frozen_for_sending():
|
||||||
can_send += c.available_to_spend(LOCAL)
|
if not self.channel_db and not self.is_trampoline_peer(c.node_id):
|
||||||
|
continue
|
||||||
|
if self.channel_db:
|
||||||
|
can_send_dict[0] += c.available_to_spend(LOCAL)
|
||||||
|
else:
|
||||||
|
can_send_dict[c.node_id] += c.available_to_spend(LOCAL)
|
||||||
|
can_send = max(can_send_dict.values()) if can_send_dict else 0
|
||||||
# Here we have to guess a fee, because some callers (submarine swaps)
|
# Here we have to guess a fee, because some callers (submarine swaps)
|
||||||
# use this method to initiate a payment, which would otherwise fail.
|
# use this method to initiate a payment, which would otherwise fail.
|
||||||
fee_base_msat = TRAMPOLINE_FEES[3]['fee_base_msat']
|
fee_base_msat = TRAMPOLINE_FEES[3]['fee_base_msat']
|
||||||
|
|||||||
Reference in New Issue
Block a user