tln: don't make invoice if peer can't possibly pay, append _sat to sat parameters to avoid confusion - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 7d2a6d83d5fce332674375586acd8a43641aaa60 DIR parent b74d4261af686c997d6229dd2befbe72dc0e34af HTML Author: Janus <ysangkok@gmail.com> Date: Wed, 30 May 2018 13:47:46 +0200 ln: don't make invoice if peer can't possibly pay, append _sat to sat parameters to avoid confusion Diffstat: M electrum/commands.py | 11 ++++++----- M lib/lnworker.py | 16 ++++++++++------ 2 files changed, 16 insertions(+), 11 deletions(-) --- DIR diff --git a/electrum/commands.py b/electrum/commands.py t@@ -765,8 +765,8 @@ class Commands: # lightning network commands @command('wpn') - def open_channel(self, node_id, amount, push_msat=0, password=None): - self.wallet.lnworker.open_channel(node_id, satoshis(amount), push_msat, password) + def open_channel(self, node_id, amount, channel_push=0, password=None): + self.wallet.lnworker.open_channel(node_id, satoshis(amount), satoshis(channel_push), password) @command('wn') def reestablish_channel(self): t@@ -777,8 +777,9 @@ class Commands: self.wallet.lnworker.pay(invoice) @command('wn') - def addinvoice(self, amount, message): - return self.wallet.lnworker.add_invoice(satoshis(amount), message) + def addinvoice(self, requested_amount, message): + # using requested_amount because it is documented in param_descriptions + return self.wallet.lnworker.add_invoice(satoshis(requested_amount), message) @command('wn') def listchannels(self): t@@ -841,7 +842,7 @@ command_options = { 'timeout': (None, "Timeout in seconds"), 'force': (None, "Create new address beyond gap limit, if no more addresses are available."), 'pending': (None, "Show only pending requests."), - 'push_msat': (None, 'push millisatoshis'), + 'channel_push':(None, 'Push initial amount (in BTC)'), 'expired': (None, "Show only expired requests."), 'paid': (None, "Show only paid requests."), 'show_addresses': (None, "Show input and output addresses"), DIR diff --git a/lib/lnworker.py b/lib/lnworker.py t@@ -171,14 +171,14 @@ class LNWorker(PrintError): self.channel_state[chan.channel_id] = "OPEN" # not aiosafe because we call .result() which will propagate an exception - async def _open_channel_coroutine(self, node_id, amount, push_msat, password): + async def _open_channel_coroutine(self, node_id, amount_sat, push_sat, password): peer = self.peers[bfh(node_id)] - openingchannel = await peer.channel_establishment_flow(self.wallet, self.config, password, amount, push_msat, temp_channel_id=os.urandom(32)) + openingchannel = await peer.channel_establishment_flow(self.wallet, self.config, password, amount_sat, push_sat * 1000, temp_channel_id=os.urandom(32)) self.print_error("SAVING OPENING CHANNEL") self.save_channel(openingchannel) - def open_channel(self, node_id, local_amt, push_amt, pw): - coro = self._open_channel_coroutine(node_id, local_amt, push_amt, None if pw == "" else pw) + def open_channel(self, node_id, local_amt_sat, push_amt_sat, pw): + coro = self._open_channel_coroutine(node_id, local_amt_sat, push_amt_sat, None if pw == "" else pw) return asyncio.run_coroutine_threadsafe(coro, self.network.asyncio_loop).result() def pay(self, invoice): t@@ -196,10 +196,14 @@ class LNWorker(PrintError): openchannel = await peer.pay(self.wallet, openchannel, msat_amt, payment_hash, pubkey, addr.min_final_cltv_expiry) self.save_channel(openchannel) - def add_invoice(self, amount, message='one cup of coffee'): + def add_invoice(self, amount_sat, message='one cup of coffee'): + is_open = lambda chan: self.channel_state[chan] == "OPEN" + # TODO doesn't account for fees!!! + if not any(openchannel.remote_state.amount_msat >= amount_sat * 1000 for openchannel in self.channels if is_open(chan)): + return "Not making invoice, no channel has enough balance" payment_preimage = os.urandom(32) RHASH = sha256(payment_preimage) - pay_req = lnencode(LnAddr(RHASH, amount/Decimal(COIN), tags=[('d', message)]), self.privkey) + pay_req = lnencode(LnAddr(RHASH, amount_sat/Decimal(COIN), tags=[('d', message)]), self.privkey) decoded = lndecode(pay_req, expected_hrp=constants.net.SEGWIT_HRP) assert decoded.pubkey.serialize() == privkey_to_pubkey(self.privkey) self.invoices[bh2u(payment_preimage)] = pay_req