Exemple #1
0
    def test_min_final_cltv_expiry_decoding(self):
        lnaddr = lndecode("lnsb500u1pdsgyf3pp5nmrqejdsdgs4n9ukgxcp2kcq265yhrxd4k5dyue58rxtp5y83s3qdqqcqzystrggccm9yvkr5yqx83jxll0qjpmgfg9ywmcd8g33msfgmqgyfyvqhku80qmqm8q6v35zvck2y5ccxsz5avtrauz8hgjj3uahppyq20qp6dvwxe",
                          expected_hrp="sb")
        self.assertEqual(144, lnaddr.get_min_final_cltv_expiry())

        lnaddr = lndecode("lntb15u1p0m6lzupp5zqjthgvaad9mewmdjuehwddyze9d8zyxcc43zhaddeegt37sndgsdq4xysyymr0vd4kzcmrd9hx7cqp7xqrrss9qy9qsqsp5vlhcs24hwm747w8f3uau2tlrdkvjaglffnsstwyamj84cxuhrn2s8tut3jqumepu42azyyjpgqa4w9w03204zp9h4clk499y2umstl6s29hqyj8vv4as6zt5567ux7l3f66m8pjhk65zjaq2esezk7ll2kcpljewkg",
                          expected_hrp="tb")
        self.assertEqual(30, lnaddr.get_min_final_cltv_expiry())
Exemple #2
0
 def test_close(self):
     alice_channel, bob_channel = create_test_channels()
     p1, p2, w1, w2, _q1, _q2 = self.prepare_peers(alice_channel, bob_channel)
     w1.network.config.set_key('dynamic_fees', False)
     w2.network.config.set_key('dynamic_fees', False)
     w1.network.config.set_key('fee_per_kb', 5000)
     w2.network.config.set_key('fee_per_kb', 1000)
     w2.enable_htlc_settle.clear()
     pay_req = run(self.prepare_invoice(w2))
     lnaddr = lndecode(pay_req, expected_hrp=constants.net.SEGWIT_HRP)
     async def pay():
         await asyncio.wait_for(p1.initialized, 1)
         await asyncio.wait_for(p2.initialized, 1)
         # alice sends htlc
         route = w1._create_route_from_invoice(decoded_invoice=lnaddr)
         htlc = p1.pay(route=route,
                       chan=alice_channel,
                       amount_msat=lnaddr.get_amount_msat(),
                       payment_hash=lnaddr.paymenthash,
                       min_final_cltv_expiry=lnaddr.get_min_final_cltv_expiry(),
                       payment_secret=lnaddr.payment_secret)
         # alice closes
         await p1.close_channel(alice_channel.channel_id)
         gath.cancel()
     async def set_settle():
         await asyncio.sleep(0.1)
         w2.enable_htlc_settle.set()
     gath = asyncio.gather(pay(), set_settle(), p1._message_loop(), p2._message_loop(), p1.htlc_switch(), p2.htlc_switch())
     async def f():
         await gath
     with self.assertRaises(concurrent.futures.CancelledError):
         run(f())
Exemple #3
0
    def test_n_decoding(self):
        # We flip the signature recovery bit, which would normally give a different
        # pubkey.
        hrp, data = bech32_decode(lnencode(LnAddr(paymenthash=RHASH, amount=24, tags=[('d', '')]), PRIVKEY), True)
        databits = u5_to_bitarray(data)
        databits.invert(-1)
        lnaddr = lndecode(bech32_encode(hrp, bitarray_to_u5(databits)), verbose=True)
        assert lnaddr.pubkey.serialize() != PUBKEY

        # But not if we supply expliciy `n` specifier!
        hrp, data = bech32_decode(lnencode(LnAddr(paymenthash=RHASH, amount=24,
                                                  tags=[('d', ''),
                                                        ('n', PUBKEY)]),
                                           PRIVKEY), True)
        databits = u5_to_bitarray(data)
        databits.invert(-1)
        lnaddr = lndecode(bech32_encode(hrp, bitarray_to_u5(databits)), verbose=True)
        assert lnaddr.pubkey.serialize() == PUBKEY
Exemple #4
0
 def set_ln_invoice(self, invoice: str):
     try:
         invoice = str(invoice).lower()
         lnaddr = lndecode(invoice, expected_hrp=constants.net.SEGWIT_HRP)
     except Exception as e:
         self.app.show_info(invoice +
                            _(" is not a valid Lightning invoice: ") +
                            repr(e))  # repr because str(Exception()) == ''
         return
     self.address = invoice
     self.message = dict(lnaddr.tags).get('d', None)
     self.amount = self.app.format_amount_and_units(
         lnaddr.amount * bitcoin.COIN) if lnaddr.amount else ''
     self.payment_request = None
     self.is_lightning = True
Exemple #5
0
    def test_roundtrip(self):
        longdescription = ('One piece of chocolate cake, one icecream cone, one'
                          ' pickle, one slice of swiss cheese, one slice of salami,'
                          ' one lollypop, one piece of cherry pie, one sausage, one'
                          ' cupcake, and one slice of watermelon')


        tests = [
            LnAddr(paymenthash=RHASH, tags=[('d', '')]),
            LnAddr(paymenthash=RHASH, amount=Decimal('0.001'), tags=[('d', '1 cup coffee'), ('x', 60)]),
            LnAddr(paymenthash=RHASH, amount=Decimal('1'), tags=[('h', longdescription)]),
            LnAddr(paymenthash=RHASH, currency='tdsv', tags=[('f', 'mk2QpYatsKicvFVuTAQLBryyccRXMUaGHP'), ('h', longdescription)]),
            LnAddr(paymenthash=RHASH, amount=24, tags=[
                ('r', [(unhexlify('029e03a901b85534ff1e92c43c74431f7ce72046060fcf7a95c37e148f78c77255'), unhexlify('0102030405060708'), 1, 20, 3),
                       (unhexlify('039e03a901b85534ff1e92c43c74431f7ce72046060fcf7a95c37e148f78c77255'), unhexlify('030405060708090a'), 2, 30, 4)]),
                ('f', 'LKes97HFbh3dxrvhiMohYXyzYJPTK37n7u'),
                ('h', longdescription)]),
            LnAddr(paymenthash=RHASH, amount=24, tags=[('f', 'MLy36ApB4YZb2cBtTc1uYJhYsP2JkYokaf'), ('h', longdescription)]),
            LnAddr(paymenthash=RHASH, amount=24, tags=[('f', 'dsv1qw508d6qejxtdg4y5r3zarvary0c5xw7kgmn4n9'), ('h', longdescription)]),
            LnAddr(paymenthash=RHASH, amount=24, tags=[('f', 'dsv1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qmu8tk5'), ('h', longdescription)]),
            LnAddr(paymenthash=RHASH, amount=24, tags=[('n', PUBKEY), ('h', longdescription)]),
            LnAddr(paymenthash=RHASH, amount=24, tags=[('h', longdescription), ('9', 514)]),
            LnAddr(paymenthash=RHASH, amount=24, tags=[('h', longdescription), ('9', 10 + (1 << 8))]),
            LnAddr(paymenthash=RHASH, amount=24, tags=[('h', longdescription), ('9', 10 + (1 << 9))]),
            LnAddr(paymenthash=RHASH, amount=24, tags=[('h', longdescription), ('9', 10 + (1 << 7) + (1 << 11))]),
            LnAddr(paymenthash=RHASH, amount=24, tags=[('h', longdescription), ('9', 10 + (1 << 12))]),
            LnAddr(paymenthash=RHASH, amount=24, tags=[('h', longdescription), ('9', 10 + (1 << 13))]),
            LnAddr(paymenthash=RHASH, amount=24, tags=[('h', longdescription), ('9', 10 + (1 << 9) + (1 << 14))]),
            LnAddr(paymenthash=RHASH, amount=24, tags=[('h', longdescription), ('9', 10 + (1 << 9) + (1 << 15))]),
            LnAddr(paymenthash=RHASH, amount=24, tags=[('h', longdescription), ('9', 33282)], payment_secret=b"\x11" * 32),
        ]

        # Roundtrip
        for t in tests:
            o = lndecode(lnencode(t, PRIVKEY), expected_hrp=t.currency)
            self.compare(t, o)
Exemple #6
0
 def test_payment_secret(self):
     lnaddr = lndecode("lnbc25m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqsp5zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zyg3zygsdq5vdhkven9v5sxyetpdees9q5sqqqqqqqqqqqqqqqpqsqvvh7ut50r00p3pg34ea68k7zfw64f8yx9jcdk35lh5ft8qdr8g4r0xzsdcrmcy9hex8un8d8yraewvhqc9l0sh8l0e0yvmtxde2z0hgpzsje5l", expected_hrp="bc")
     self.assertEqual((1 << 9) + (1 << 15) + (1 << 99), lnaddr.get_tag('9'))
     self.assertEqual(b"\x11" * 32, lnaddr.payment_secret)
Exemple #7
0
    def test_features(self):
        lnaddr = lndecode("lnbc25m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5vdhkven9v5sxyetpdees9qzsze992adudgku8p05pstl6zh7av6rx2f297pv89gu5q93a0hf3g7lynl3xq56t23dpvah6u7y9qey9lccrdml3gaqwc6nxsl5ktzm464sq73t7cl", expected_hrp="bc")
        self.assertEqual(514, lnaddr.get_tag('9'))

        with self.assertRaises(UnknownEvenFeatureBits):
            lndecode("lnbc25m1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdq5vdhkven9v5sxyetpdees9q4pqqqqqqqqqqqqqqqqqqszk3ed62snp73037h4py4gry05eltlp0uezm2w9ajnerhmxzhzhsu40g9mgyx5v3ad4aqwkmvyftzk4k9zenz90mhjcy9hcevc7r3lx2sphzfxz7", expected_hrp="bc")
Exemple #8
0
 def test_min_final_cltv_expiry_roundtrip(self):
     for cltv in (1, 15, 16, 31, 32, 33, 150, 511, 512, 513, 1023, 1024, 1025):
         lnaddr = LnAddr(paymenthash=RHASH, amount=Decimal('0.001'), tags=[('d', '1 cup coffee'), ('x', 60), ('c', cltv)])
         invoice = lnencode(lnaddr, PRIVKEY)
         self.assertEqual(cltv, lndecode(invoice).get_min_final_cltv_expiry())