URI: 
       tlnbase: try to receive payment, work on commitment tx with htlcs - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 3c34628ffbf6af5bf40d8601d284d0fa5960d4d4
   DIR parent 0f552422a674b91617ae3b3aa5478232f4362741
  HTML Author: Janus <ysangkok@gmail.com>
       Date:   Tue, 24 Apr 2018 17:12:55 +0200
       
       lnbase: try to receive payment, work on commitment tx with htlcs
       
       Diffstat:
         M lib/lnbase.py                       |     105 +++++++++++++++++++++----------
         M lib/tests/test_lnbase.py            |      20 +++++++++-----------
         M lib/tests/test_lnbase_online.py     |      12 ++++++------
       
       3 files changed, 86 insertions(+), 51 deletions(-)
       ---
   DIR diff --git a/lib/lnbase.py b/lib/lnbase.py
       t@@ -39,7 +39,8 @@ LocalCtxArgs = namedtuple("LocalCtxArgs",
                    "base_point", "remote_payment_basepoint",
                    "remote_revocation_pubkey", "local_delayedpubkey", "to_self_delay",
                    "funding_txid", "funding_index", "funding_satoshis",
       -            "local_amount", "remote_amount", "dust_limit_satoshis"])
       +            "local_amount", "remote_amount", "dust_limit_satoshis", "local_feerate",
       +            "commitment_owner"])
        
        # hardcoded nodes
        node_list = [
       t@@ -402,12 +403,11 @@ def make_htlc_tx(cltv_timeout, inputs, output):
            tx.BIP_LI01_sort()
            return tx
        
       -def make_offered_htlc(revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, payment_preimage):
       +def make_offered_htlc(revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, payment_hash):
            assert type(revocation_pubkey) is bytes
            assert type(remote_htlcpubkey) is bytes
            assert type(local_htlcpubkey) is bytes
       -    assert type(payment_preimage) is bytes
       -    payment_hash = bitcoin.sha256(payment_preimage)
       +    assert type(payment_hash) is bytes
            return bytes([opcodes.OP_DUP, opcodes.OP_HASH160]) + bfh(push_script(bh2u(bitcoin.hash_160(revocation_pubkey))))\
                + bytes([opcodes.OP_EQUAL, opcodes.OP_IF, opcodes.OP_CHECKSIG, opcodes.OP_ELSE]) \
                + bfh(push_script(bh2u(remote_htlcpubkey)))\
       t@@ -416,12 +416,11 @@ def make_offered_htlc(revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, pa
                + bytes([opcodes.OP_CHECKMULTISIG, opcodes.OP_ELSE, opcodes.OP_HASH160])\
                + bfh(push_script(bh2u(bitcoin.ripemd(payment_hash)))) + bytes([opcodes.OP_EQUALVERIFY, opcodes.OP_CHECKSIG, opcodes.OP_ENDIF, opcodes.OP_ENDIF])
        
       -def make_received_htlc(revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, payment_preimage, cltv_expiry):
       -    for i in [revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, payment_preimage]:
       +def make_received_htlc(revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, payment_hash, cltv_expiry):
       +    for i in [revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, payment_hash]:
                assert type(i) is bytes
            assert type(cltv_expiry) is int
        
       -    payment_hash = bitcoin.sha256(payment_preimage)
            return bytes([opcodes.OP_DUP, opcodes.OP_HASH160]) \
                + bfh(push_script(bh2u(bitcoin.hash_160(revocation_pubkey)))) \
                + bytes([opcodes.OP_EQUAL, opcodes.OP_IF, opcodes.OP_CHECKSIG, opcodes.OP_ELSE]) \
       t@@ -444,7 +443,8 @@ def make_commitment(ctn, local_funding_pubkey, remote_funding_pubkey, remotepubk
                            payment_basepoint, remote_payment_basepoint,
                            revocation_pubkey, delayed_pubkey, to_self_delay,
                            funding_txid, funding_pos, funding_satoshis,
       -                    local_amount, remote_amount, dust_limit_satoshis, htlcs=[]):
       +                    local_amount, remote_amount, dust_limit_satoshis, local_feerate, commitment_owner, htlcs):
       +
            pubkeys = sorted([bh2u(local_funding_pubkey), bh2u(remote_funding_pubkey)])
            obs = get_obscured_ctn(ctn, payment_basepoint, remote_payment_basepoint)
            locktime = (0x20 << 24) + (obs & 0xffffff)
       t@@ -467,20 +467,31 @@ def make_commitment(ctn, local_funding_pubkey, remote_funding_pubkey, remotepubk
                           + bytes([opcodes.OP_CSV, opcodes.OP_DROP]) + bfh(push_script(bh2u(delayed_pubkey))) + bytes([opcodes.OP_ENDIF, opcodes.OP_CHECKSIG])
            local_address = bitcoin.redeem_script_to_address('p2wsh', bh2u(local_script))
            remote_address = bitcoin.pubkey_to_address('p2wpkh', bh2u(remotepubkey))
       -    to_local = (bitcoin.TYPE_ADDRESS, local_address, local_amount)
       -    to_remote = (bitcoin.TYPE_ADDRESS, remote_address, remote_amount)
       +    # TODO trim htlc outputs here while also considering 2nd stage htlc transactions
       +    fee = local_feerate * overall_weight(len(htlcs)) // 1000 # TODO incorrect if anything is trimmed
       +    fee_local, fee_remote = 0, 0
       +    if commitment_owner == FOR_US:
       +      fee_local = fee
       +    elif commitment_owner == FOR_REMOTE:
       +      fee_remote = fee
       +    else:
       +      raise Exception("unexpected commitment owner")
       +    to_local = (bitcoin.TYPE_ADDRESS, local_address, local_amount - fee_local)
       +    to_remote = (bitcoin.TYPE_ADDRESS, remote_address, remote_amount - fee_remote)
            c_outputs = [to_local, to_remote]
            for script, msat_amount in htlcs:
                c_outputs += [(bitcoin.TYPE_ADDRESS, bitcoin.redeem_script_to_address('p2wsh', bh2u(script)), msat_amount // 1000)]
            # trim outputs
            c_outputs = list(filter(lambda x:x[2]>= dust_limit_satoshis, c_outputs))
       +
            # create commitment tx
            tx = Transaction.from_io(c_inputs, c_outputs, locktime=locktime, version=2)
            tx.BIP_LI01_sort()
            return tx
        
       -class Peer(PrintError):
       +FOR_US, FOR_REMOTE = range(2)
        
       +class Peer(PrintError):
            def __init__(self, host, port, pubkey, request_initial_sync=False, network=None):
                self.host = host
                self.port = port
       t@@ -735,7 +746,7 @@ class Peer(PrintError):
                    delayed_payment_basepoint=delayed_payment_basepoint,
                    first_per_commitment_point=per_commitment_point_first,
                    to_self_delay=to_self_delay,
       -            max_htlc_value_in_flight_msat=10_000
       +            max_htlc_value_in_flight_msat=500000 * 1000
                )
                self.channel_accepted[temp_channel_id] = asyncio.Future()
                self.send_message(msg)
       t@@ -750,8 +761,14 @@ class Peer(PrintError):
                remote_revocation_basepoint = payload['revocation_basepoint']
                remote_payment_basepoint = payload['payment_basepoint']
                remote_delayed_payment_basepoint = payload['delayed_payment_basepoint']
       +        remote_htlc_basepoint = payload['htlc_basepoint']
       +        remote_htlc_minimum_msat = int.from_bytes(payload['htlc_minimum_msat'], "big")
       +        remote_max_htlc_value_in_flight_msat = int.from_bytes(payload['max_htlc_value_in_flight_msat'], "big")
                funding_txn_minimum_depth = int.from_bytes(payload['minimum_depth'], byteorder="big")
       -        self.print_error('remote dust limit', remote_dust_limit_satoshis)
       +        print('remote dust limit', remote_dust_limit_satoshis)
       +        assert remote_dust_limit_satoshis < 600
       +        assert remote_htlc_minimum_msat < 600 * 1000
       +        assert remote_max_htlc_value_in_flight_msat >= 500 * 1000 * 1000, remote_max_htlc_value_in_flight_msat
                self.print_error('remote delay', remote_delay)
                self.print_error('funding_txn_minimum_depth', funding_txn_minimum_depth)
                # create funding tx
       t@@ -772,10 +789,10 @@ class Peer(PrintError):
                remote_delayedpubkey = derive_pubkey(remote_delayed_payment_basepoint, remote_per_commitment_point)
                # compute amounts
                htlcs = []
       -        fee = local_feerate * overall_weight(len(htlcs)) // 1000
                to_local_msat = funding_satoshis*1000 - push_msat
                to_remote_msat = push_msat
       -        local_amount = to_local_msat // 1000 - fee
       +        #fee = local_feerate * overall_weight(0) // 1000 # TODO shouldnt be here
       +        local_amount = to_local_msat // 1000
                remote_amount = to_remote_msat // 1000
                # remote commitment transaction
                remote_ctx = make_commitment(
       t@@ -784,7 +801,7 @@ class Peer(PrintError):
                    base_point, remote_payment_basepoint,
                    revocation_pubkey, remote_delayedpubkey, remote_delay,
                    funding_txid, funding_index, funding_satoshis,
       -            remote_amount, local_amount, remote_dust_limit_satoshis)
       +            remote_amount, local_amount, remote_dust_limit_satoshis, local_feerate, FOR_REMOTE, htlcs=[])
                remote_ctx.sign({bh2u(funding_pubkey): (funding_privkey, True)})
                sig_index = pubkeys.index(bh2u(funding_pubkey))
                sig = bytes.fromhex(remote_ctx.inputs()[0]["signatures"][sig_index])
       t@@ -807,8 +824,8 @@ class Peer(PrintError):
                    base_point, remote_payment_basepoint,
                    remote_revocation_pubkey, local_delayedpubkey, to_self_delay,
                    funding_txid, funding_index, funding_satoshis,
       -            local_amount, remote_amount, dust_limit_satoshis)
       -        local_ctx = make_commitment(*local_ctx_args)
       +            local_amount, remote_amount, dust_limit_satoshis, local_feerate, FOR_US)
       +        local_ctx = make_commitment(*local_ctx_args, htlcs=[])
                pre_hash = bitcoin.Hash(bfh(local_ctx.serialize_preimage(0)))
                if not bitcoin.verify_signature(remote_funding_pubkey, remote_sig, pre_hash):
                    raise Exception('verifying remote signature failed.')
       t@@ -843,40 +860,60 @@ class Peer(PrintError):
                self.send_message(gen_msg("funding_locked", channel_id=channel_id, next_per_commitment_point=per_commitment_point_second))
                # wait until we receive funding_locked
                try:
       -            payload = await self.remote_funding_locked[channel_id]
       +            remote_funding_locked_msg = await self.remote_funding_locked[channel_id]
                finally:
                    del self.remote_funding_locked[channel_id]
       -        self.print_error('Done waiting for remote_funding_locked', payload)
       +        self.print_error('Done waiting for remote_funding_locked', remote_funding_locked_msg)
                self.commitment_signed[channel_id] = asyncio.Future()
       -        return channel_id, per_commitment_secret_seed, local_ctx_args, remote_funding_pubkey
       -    async def receive_commitment_revoke_ack(self, channel_id, per_commitment_secret_seed, last_pcs_index, local_ctx_args, expected_received_sat, remote_funding_pubkey, next_commitment_number):
       +        return channel_id, per_commitment_secret_seed, local_ctx_args, remote_funding_pubkey, remote_funding_locked_msg, remote_revocation_basepoint, remote_htlc_basepoint, htlc_basepoint
       +
       +    async def receive_commitment_revoke_ack(self, channel_id, local_per_commitment_secret_seed, local_last_pcs_index, local_ctx_args, expected_received_sat, remote_funding_pubkey, local_next_commitment_number, remote_next_commitment_point, remote_revocation_basepoint, remote_htlc_basepoint, local_htlc_basepoint):
                try:
                    commitment_signed_msg = await self.commitment_signed[channel_id]
                finally:
                    del self.commitment_signed[channel_id]
                    # TODO make new future? (there could be more updates)
        
       -        local_ctx_args = local_ctx_args._replace(local_amount = local_ctx_args.local_amount + expected_received_sat)
       +        local_last_per_commitment_secret = get_per_commitment_secret_from_seed(local_per_commitment_secret_seed, local_last_pcs_index)
       +
       +        local_next_per_commitment_secret = get_per_commitment_secret_from_seed(local_per_commitment_secret_seed, local_last_pcs_index - 1)
       +        local_next_per_commitment_point = secret_to_pubkey(int.from_bytes(
       +            local_next_per_commitment_secret,
       +            byteorder="big"))
       +
                local_ctx_args = local_ctx_args._replace(remote_amount = local_ctx_args.remote_amount - expected_received_sat)
       -        local_ctx_args = local_ctx_args._replace(ctn = next_commitment_number)
       -        new_commitment = make_commitment(*local_ctx_args)
       -        pre_hash = bitcoin.Hash(bfh(new_commitment.serialize_preimage(0)))
       +        local_ctx_args = local_ctx_args._replace(ctn = local_next_commitment_number)
       +
       +        remote_revocation_pubkey = derive_blinded_pubkey(remote_revocation_basepoint, remote_next_commitment_point)
       +        remote_htlc_pubkey = derive_pubkey(remote_htlc_basepoint, remote_next_commitment_point)
       +        local_htlc_pubkey = derive_pubkey(local_htlc_basepoint, local_next_per_commitment_point)
       +        payment_hash = self.unfulfilled_htlcs[0]["payment_hash"]
       +        cltv_expiry = int.from_bytes(self.unfulfilled_htlcs[0]["cltv_expiry"],"big")
       +        amount_msat = int.from_bytes(self.unfulfilled_htlcs[0]["amount_msat"], "big")
       +
       +        # make_received_htlc(revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, payment_hash, cltv_expiry)
       +        htlcs = [
       +            (
       +                make_received_htlc(remote_revocation_pubkey, remote_htlc_pubkey, local_htlc_pubkey, payment_hash, cltv_expiry),
       +                amount_msat
       +            )
       +        ]
       +
       +        new_commitment = make_commitment(*local_ctx_args, htlcs=htlcs)
       +        preimage_hex = new_commitment.serialize_preimage(0)
       +        print("new commitment tx", new_commitment)
       +        print("new commitment tx outputs", new_commitment.outputs())
       +        pre_hash = bitcoin.Hash(bfh(preimage_hex))
                if not bitcoin.verify_signature(remote_funding_pubkey, commitment_signed_msg["signature"], pre_hash):
                    raise Exception('failed verifying signature of updated commitment transaction')
        
       -        last_per_commitment_secret = get_per_commitment_secret_from_seed(per_commitment_secret_seed, last_pcs_index)
       -
       -        next_per_commitment_secret = get_per_commitment_secret_from_seed(per_commitment_secret_seed, last_pcs_index - 1)
       -        next_per_commitment_point = secret_to_pubkey(int.from_bytes(
       -            next_per_commitment_secret,
       -            byteorder="big"))
       -
       -        self.send_message(gen_msg("revoke_and_ack", channel_id=channel_id, per_commitment_secret=last_per_commitment_secret, next_per_commitment_point=next_per_commitment_point))
       +        self.send_message(gen_msg("revoke_and_ack", channel_id=channel_id, per_commitment_secret=local_last_per_commitment_secret, next_per_commitment_point=local_next_per_commitment_point))
        
            async def fulfill_htlc(self, channel_id, htlc_id, payment_preimage):
                self.send_message(gen_msg("update_fulfill_htlc", channel_id=channel_id, id=htlc_id, payment_preimage=payment_preimage))
        
            def on_commitment_signed(self, payload):
       +        self.print_error("commitment_signed", payload)
                channel_id = int.from_bytes(payload['channel_id'], byteorder="big")
                self.commitment_signed[channel_id].set_result(payload)
        
   DIR diff --git a/lib/tests/test_lnbase.py b/lib/tests/test_lnbase.py
       t@@ -61,8 +61,7 @@ class Test_LNBase(unittest.TestCase):
                remote_signature = "3045022100f51d2e566a70ba740fc5d8c0f07b9b93d2ed741c3c0860c613173de7d39e7968022041376d520e9c0e1ad52248ddf4b22e12be8763007df977253ef45a4ca3bdb7c0"
                # local_signature = 3044022051b75c73198c6deee1a875871c3961832909acd297c6b908d59e3319e5185a46022055c419379c5051a78d00dbbce11b5b664a0c22815fbcc6fcef6b1937c3836939
                htlcs=[]
       -        fee = local_feerate_per_kw * overall_weight(len(htlcs)) // 1000
       -        local_amount = to_local_msat // 1000 - fee
       +        local_amount = to_local_msat // 1000
                remote_amount = to_remote_msat // 1000
                our_commit_tx = make_commitment(
                    commitment_number,
       t@@ -70,7 +69,7 @@ class Test_LNBase(unittest.TestCase):
                    local_payment_basepoint, remote_payment_basepoint,
                    local_revocation_pubkey, local_delayedpubkey, local_delay,
                    funding_tx_id, funding_output_index, funding_amount_satoshi,
       -            local_amount, remote_amount, local_dust_limit_satoshi)
       +            local_amount, remote_amount, local_dust_limit_satoshi, local_fee_rate=local_feerate_per_kw, htlcs=[])
                self.sign_and_insert_remote_sig(our_commit_tx, remote_funding_pubkey, remote_signature, local_funding_pubkey, local_funding_privkey)
                ref_commit_tx_str = '02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b820b584a488489000000000038b02b8002c0c62d0000000000160014ccf1af2f2aabee14bb40fa3851ab2301de84311054a56a00000000002200204adb4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e0400473044022051b75c73198c6deee1a875871c3961832909acd297c6b908d59e3319e5185a46022055c419379c5051a78d00dbbce11b5b664a0c22815fbcc6fcef6b1937c383693901483045022100f51d2e566a70ba740fc5d8c0f07b9b93d2ed741c3c0860c613173de7d39e7968022041376d520e9c0e1ad52248ddf4b22e12be8763007df977253ef45a4ca3bdb7c001475221023da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb21030e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c152ae3e195220'
                self.assertEqual(str(our_commit_tx), ref_commit_tx_str)
       t@@ -104,35 +103,35 @@ class Test_LNBase(unittest.TestCase):
        
                htlc2_cltv_timeout = 502
                htlc2_payment_preimage = b"\x02" * 32
       -        htlc2 = make_offered_htlc(local_revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, htlc2_payment_preimage)
       +        htlc2 = make_offered_htlc(local_revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, bitcoin.sha256(htlc2_payment_preimage))
                # HTLC 2 offered amount 2000
                ref_htlc2_wscript = "76a91414011f7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8122cc726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475527c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae67a914b43e1b38138a41b37f7cd9a1d274bc63e3a9b5d188ac6868"
                self.assertEqual(htlc2, bfh(ref_htlc2_wscript))
        
                htlc3_cltv_timeout = 503
                htlc3_payment_preimage = b"\x03" * 32
       -        htlc3 = make_offered_htlc(local_revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, htlc3_payment_preimage)
       +        htlc3 = make_offered_htlc(local_revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, bitcoin.sha256(htlc3_payment_preimage))
                # HTLC 3 offered amount 3000 
                ref_htlc3_wscript = "76a91414011f7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8122cc726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475527c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae67a9148a486ff2e31d6158bf39e2608864d63fefd09d5b88ac6868"
                self.assertEqual(htlc3, bfh(ref_htlc3_wscript))
        
                htlc0_cltv_timeout = 500
                htlc0_payment_preimage = b"\x00" * 32
       -        htlc0 = make_received_htlc(local_revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, htlc0_payment_preimage, htlc0_cltv_timeout)
       +        htlc0 = make_received_htlc(local_revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, bitcoin.sha256(htlc0_payment_preimage), htlc0_cltv_timeout)
                # HTLC 0 received amount 1000
                ref_htlc0_wscript = "76a91414011f7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a914b8bcb07f6344b42ab04250c86a6e8b75d3fdbbc688527c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae677502f401b175ac6868"
                self.assertEqual(htlc0, bfh(ref_htlc0_wscript))
        
                htlc1_cltv_timeout = 501
                htlc1_payment_preimage = b"\x01" * 32
       -        htlc1 = make_received_htlc(local_revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, htlc1_payment_preimage, htlc1_cltv_timeout)
       +        htlc1 = make_received_htlc(local_revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, bitcoin.sha256(htlc1_payment_preimage), htlc1_cltv_timeout)
                # HTLC 1 received amount 2000 
                ref_htlc1_wscript = "76a91414011f7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a9144b6b2e5444c2639cc0fb7bcea5afba3f3cdce23988527c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae677502f501b175ac6868"
                self.assertEqual(htlc1, bfh(ref_htlc1_wscript))
        
                htlc4_cltv_timeout = 504
                htlc4_payment_preimage = b"\x04" * 32
       -        htlc4 = make_received_htlc(local_revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, htlc4_payment_preimage, htlc4_cltv_timeout)
       +        htlc4 = make_received_htlc(local_revocation_pubkey, remote_htlcpubkey, local_htlcpubkey, bitcoin.sha256(htlc4_payment_preimage), htlc4_cltv_timeout)
                # HTLC 4 received amount 4000 
                ref_htlc4_wscript = "76a91414011f7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a91418bc1a114ccf9c052d3d23e28d3b0a9d1227434288527c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae677502f801b175ac6868"
                self.assertEqual(htlc4, bfh(ref_htlc4_wscript))
       t@@ -150,8 +149,7 @@ class Test_LNBase(unittest.TestCase):
                htlc4_msat = 4000 * 1000
                htlcs = [(htlc2, htlc2_msat), (htlc3, htlc3_msat), (htlc0, htlc0_msat), (htlc1, htlc1_msat), (htlc4, htlc4_msat)]
        
       -        fee = local_feerate_per_kw * overall_weight(len(htlcs)) // 1000
       -        local_amount = to_local_msat // 1000 - fee
       +        local_amount = to_local_msat // 1000
                remote_amount = to_remote_msat // 1000
                our_commit_tx = make_commitment(
                    commitment_number,
       t@@ -160,7 +158,7 @@ class Test_LNBase(unittest.TestCase):
                    local_revocation_pubkey, local_delayedpubkey, local_delay,
                    funding_tx_id, funding_output_index, funding_amount_satoshi,
                    local_amount, remote_amount, local_dust_limit_satoshi,
       -            htlcs=htlcs)
       +            htlcs=htlcs, local_fee_rate=local_feerate_per_kw)
                self.sign_and_insert_remote_sig(our_commit_tx, remote_funding_pubkey, remote_signature, local_funding_pubkey, local_funding_privkey)
                self.assertEqual(str(our_commit_tx), output_commit_tx)
        
   DIR diff --git a/lib/tests/test_lnbase_online.py b/lib/tests/test_lnbase_online.py
       t@@ -43,19 +43,19 @@ if __name__ == "__main__":
            peer = Peer(host, port, pubkey, request_initial_sync=False, network=network)
            network.futures.append(asyncio.run_coroutine_threadsafe(peer.main_loop(), network.asyncio_loop))
        
       -    funding_satoshis = 200000
       -    push_msat = 100000
       +    funding_satoshis = 1000000
       +    push_msat = 500000000
        
            # run blocking test
            async def async_test():
                payment_preimage = bytes.fromhex("01"*32)
                RHASH = sha256(payment_preimage)
       -        channel_id, per_commitment_secret_seed, local_ctx_args, remote_funding_pubkey = await peer.channel_establishment_flow(wallet, config, funding_satoshis, push_msat)
       -        pay_req = lnencode(LnAddr(RHASH, amount=Decimal("0.00000001")*10, tags=[('d', 'one cup of coffee')]), peer.privkey[:32])
       +        channel_id, per_commitment_secret_seed, local_ctx_args, remote_funding_pubkey, remote_funding_locked_msg, remote_revocation_basepoint, remote_htlc_basepoint, local_htlc_basepoint = await peer.channel_establishment_flow(wallet, config, funding_satoshis, push_msat)
       +        expected_received_sat = 400000
       +        pay_req = lnencode(LnAddr(RHASH, amount=Decimal("0.00000001")*expected_received_sat, tags=[('d', 'one cup of coffee')]), peer.privkey[:32])
                print("payment request", pay_req)
                last_pcs_index = 2**48 - 1
       -        expected_received_sat = 10
       -        await peer.receive_commitment_revoke_ack(channel_id, per_commitment_secret_seed, last_pcs_index, local_ctx_args, expected_received_sat, remote_funding_pubkey, next_commitment_number=1)
       +        await peer.receive_commitment_revoke_ack(channel_id, per_commitment_secret_seed, last_pcs_index, local_ctx_args, expected_received_sat, remote_funding_pubkey, local_next_commitment_number=1, remote_next_commitment_point=remote_funding_locked_msg["next_per_commitment_point"], remote_revocation_basepoint=remote_revocation_basepoint, remote_htlc_basepoint=remote_htlc_basepoint, local_htlc_basepoint=local_htlc_basepoint)
                htlc_id = 0 # TODO should correspond with received htlc (when handling more than just one update)
                await peer.fulfill_htlc(channel_id, htlc_id, payment_preimage)
                while True: