parent
561169a557
commit
2fd2ffc419
@ -0,0 +1 @@
|
||||
Support for Lightning Submarine Swaps
|
After Width: | Height: | Size: 233 B |
Binary file not shown.
@ -0,0 +1,51 @@
|
||||
from common import *
|
||||
|
||||
from apps.bitcoin.scripts import output_script_native_segwit, output_script_p2sh, redeem_script_paytolnswap
|
||||
from trezor.crypto.hashlib import sha256
|
||||
from trezor.crypto.scripts import sha256_ripemd160
|
||||
|
||||
class TestScripts(unittest.TestCase):
|
||||
|
||||
def test_redeem_script_paytolnswap(self):
|
||||
VECTORS = [
|
||||
(
|
||||
unhexlify("53ada8e6de01c26ff43040887ba7b22bddce19f8658fd1ba00716ed79d15cd5e"),
|
||||
unhexlify("03f8109578aae1e5cfc497e466cf6ae6625497cd31886e87b2f4f54f3f0f46b539"),
|
||||
515924,
|
||||
unhexlify("03ec0c1e45b709d708cd376a6f2daf19ac27be229647780d592e27d7fb7efb207a"),
|
||||
unhexlify("76a914e2ac8cb97af3d59b1c057db4b0c4f9aa12a912738763752103f8109578aae1e5cfc497e466cf6ae6625497cd31886e87b2f4f54f3f0f46b539670354df07b17576a914ce99030daa71c4dfb155de212e475284d7a2cedb8868ac"),
|
||||
unhexlify("0020727f212ed5f7c03cc0b9674ca383935ac9215006072db397aa305e11f43d7240"),
|
||||
unhexlify("a914dd0d74da9b0b8b2d899c9c4f3e5ad2b2336f002987"),
|
||||
),
|
||||
(
|
||||
unhexlify("0f817af9d08abe80e2d4980903ec329deaedb81ecfccada6a5cd6794e2a5a3a2"),
|
||||
unhexlify("027f1d103826584b3c216d6a62600d8b6c7e2de62ab059d38dfd6427f3e3d7deca"),
|
||||
725440,
|
||||
unhexlify("0396070f2813933502e907c011ae7ba928683a9c2f0e888dae7ebd2c41120ee6b5"),
|
||||
unhexlify("76a91426282c115718ef107f305272fb7d7723bacfd46a87637521027f1d103826584b3c216d6a62600d8b6c7e2de62ab059d38dfd6427f3e3d7deca6703c0110bb17576a914ece6935b2a5a5b5ff997c87370b16fa10f1644108868ac"),
|
||||
unhexlify("00200600ace6f612cb757b0cfacaf5cfbdf36ea59b2b9350e7de958e1f98ff06621b"),
|
||||
unhexlify("a91482e95b5ab909b8d560bdfb4dc2d70fe75aa48b3787"),
|
||||
),
|
||||
(
|
||||
unhexlify("72d29ccfd52ca94b69e14fc8efdf41ad845ece4bac1ee04627a8f9c83a49de8c"),
|
||||
unhexlify("022e05052f864845f67640651f5463e4a2921f07a46e24e79dd8bd0a4fdc896208"),
|
||||
725457,
|
||||
unhexlify("0396070f2813933502e907c011ae7ba928683a9c2f0e888dae7ebd2c41120ee6b5"),
|
||||
unhexlify("76a91403d7eba1e13f81e87221be9392d7afdefdcb8ed987637521022e05052f864845f67640651f5463e4a2921f07a46e24e79dd8bd0a4fdc8962086703d1110bb17576a914ece6935b2a5a5b5ff997c87370b16fa10f1644108868ac"),
|
||||
unhexlify("00200c2965d3a25f0207a013da7dfa208989f493e1f3ef45c920dcdc85d1af837e8a"),
|
||||
unhexlify("a9142b503fe62b792866933ddeaa087dac5abbc1fcf987"),
|
||||
),
|
||||
]
|
||||
for payment_hash, destination, ctlv, refund_pubkey, redeem_script, script_witness, script_p2sh_witness in VECTORS:
|
||||
s = redeem_script_paytolnswap(payment_hash, destination, ctlv, refund_pubkey)
|
||||
self.assertEqual(s, redeem_script)
|
||||
h = sha256(s).digest()
|
||||
w = output_script_native_segwit(0, h)
|
||||
self.assertEqual(w, script_witness)
|
||||
h = sha256_ripemd160(w).digest()
|
||||
p = output_script_p2sh(h)
|
||||
self.assertEqual(p, script_p2sh_witness)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
@ -0,0 +1,125 @@
|
||||
# This file is part of the Trezor project.
|
||||
#
|
||||
# Copyright (C) 2022 SatoshiLabs and contributors
|
||||
#
|
||||
# This library is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License version 3
|
||||
# as published by the Free Software Foundation.
|
||||
#
|
||||
# This library is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the License along with this library.
|
||||
# If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
|
||||
|
||||
from trezorlib import bech32, btc, messages
|
||||
from trezorlib.debuglink import TrezorClientDebugLink as Client
|
||||
from trezorlib.tools import hash_160_to_bc_address, parse_path
|
||||
|
||||
from ...tx_cache import TxCache
|
||||
|
||||
TX_CACHE_MAINNET = TxCache("Bitcoin")
|
||||
|
||||
TXHASH_0dac36 = bytes.fromhex(
|
||||
"0dac366fd8a67b2a89fbb0d31086e7acded7a5bbf9ef9daa935bc873229ef5b5"
|
||||
)
|
||||
|
||||
VECTORS = [
|
||||
(
|
||||
messages.LightningNetworkSwapType(
|
||||
invoice="lnbc538340n1p3q7l23pp57vysk3kakcfynz09du0zy87zy7n4gc6czqettc7c5v9v2fsrs9nqdpa2pskjepqw3hjq3r0deshgefqw3hjqjzjgcs8vv3qyq5y7unyv4ezqj2y8gszjxqy9ghlcqpjsp50lm6njtrm9qlyaac8252x4s4l3eu0aryx7zjjw4zrq6hgpk2evwqrzjqtesdx359t3gswn09838tur09zjk5m4zutvk7kyg5vnxg3xu74ptvzhchqqq3kgqqyqqqqqqqqqqqqgq9q9qyyssqlg84727az93gg8n37gv994w3r6dj0u8dk55qjlstappyuehq3mqjcafkyj2a39xp0w34mnzy04hzqnct7fecd380wfa0kc0en8v006sqxqchh5",
|
||||
htlc=bytes.fromhex(
|
||||
"02528a57b9b55e86f08562b2e49fe52649924600f865e14a41defac5cdc8d4a3ea"
|
||||
),
|
||||
cltv=725891,
|
||||
swap_script_type=messages.InputScriptType.SPENDP2SHWITNESS,
|
||||
# bc1qannfxke2tfd4l7vhepehpvt05y83v3qsf6nfkk
|
||||
refund_address_n=parse_path("m/84h/0h/0h/0/0"),
|
||||
refund_script_type=messages.InputScriptType.SPENDWITNESS,
|
||||
),
|
||||
"3NtRY64WfQk2vZy8GUhwQzzMmyY9ZhNEVi",
|
||||
"0100000001b5f59e2273c85b93aa9deff9bba5d7deace78610d3b0fb892a7ba6d86f36ac0d000000006b483045022100b67aeab2efbd533606b6b808d7a990ca04ec73f84947d086ef954f36bb16425e02201578ce2f893f8c63812fc8438165044d68c4a2abca40f2f4e7ecd36f739bedf6012103d7f3a07085bee09697cf03125d5c8760dfed65403dba787f1d1d8b1251af2cbeffffffff0160ea00000000000017a914e882ed93fcb8ba83b088a04ff4180035671ef39d8700000000",
|
||||
),
|
||||
(
|
||||
messages.LightningNetworkSwapType(
|
||||
invoice="lnbc538340n1p3q7l23pp57vysk3kakcfynz09du0zy87zy7n4gc6czqettc7c5v9v2fsrs9nqdpa2pskjepqw3hjq3r0deshgefqw3hjqjzjgcs8vv3qyq5y7unyv4ezqj2y8gszjxqy9ghlcqpjsp50lm6njtrm9qlyaac8252x4s4l3eu0aryx7zjjw4zrq6hgpk2evwqrzjqtesdx359t3gswn09838tur09zjk5m4zutvk7kyg5vnxg3xu74ptvzhchqqq3kgqqyqqqqqqqqqqqqgq9q9qyyssqlg84727az93gg8n37gv994w3r6dj0u8dk55qjlstappyuehq3mqjcafkyj2a39xp0w34mnzy04hzqnct7fecd380wfa0kc0en8v006sqxqchh5",
|
||||
htlc=bytes.fromhex(
|
||||
"02528a57b9b55e86f08562b2e49fe52649924600f865e14a41defac5cdc8d4a3ea"
|
||||
),
|
||||
cltv=725891,
|
||||
swap_script_type=messages.InputScriptType.SPENDWITNESS,
|
||||
# bc1qannfxke2tfd4l7vhepehpvt05y83v3qsf6nfkk
|
||||
refund_address_n=parse_path("m/84h/0h/0h/0/0"),
|
||||
refund_script_type=messages.InputScriptType.SPENDWITNESS,
|
||||
),
|
||||
"bc1qx40dk7j6nkk0m8ffy5u93uujvf2jtqqqd9905l8t7fjtwsggu0rs0vmpd2",
|
||||
"0100000001b5f59e2273c85b93aa9deff9bba5d7deace78610d3b0fb892a7ba6d86f36ac0d000000006a47304402200828f923298a73dde0a8e385e078964bd97063b89d0d216b767fff94fecc301202200805908bcf4147f53e7b4e5a54de294a24874a4331ae141705c6ea203cb7429f012103d7f3a07085bee09697cf03125d5c8760dfed65403dba787f1d1d8b1251af2cbeffffffff0160ea000000000000220020355edb7a5a9dacfd9d29253858f3926255258000694afa7cebf264b74108e3c700000000",
|
||||
),
|
||||
(
|
||||
messages.LightningNetworkSwapType(
|
||||
invoice="lnbc538340n1p3q7l23pp57vysk3kakcfynz09du0zy87zy7n4gc6czqettc7c5v9v2fsrs9nqdpa2pskjepqw3hjq3r0deshgefqw3hjqjzjgcs8vv3qyq5y7unyv4ezqj2y8gszjxqy9ghlcqpjsp50lm6njtrm9qlyaac8252x4s4l3eu0aryx7zjjw4zrq6hgpk2evwqrzjqtesdx359t3gswn09838tur09zjk5m4zutvk7kyg5vnxg3xu74ptvzhchqqq3kgqqyqqqqqqqqqqqqgq9q9qyyssqlg84727az93gg8n37gv994w3r6dj0u8dk55qjlstappyuehq3mqjcafkyj2a39xp0w34mnzy04hzqnct7fecd380wfa0kc0en8v006sqxqchh5",
|
||||
htlc=bytes.fromhex(
|
||||
"03bf9df301a514a83c0ccfea0e62951b19897fbb98f1612d56588edf1edc1bdf2a"
|
||||
),
|
||||
cltv=725893,
|
||||
swap_script_type=messages.InputScriptType.SPENDP2SHWITNESS,
|
||||
# 1JAd7XCBzGudGpJQSDSfpmJhiygtLQWaGL
|
||||
refund_address_n=parse_path("m/44h/0h/0h/0/0"),
|
||||
refund_script_type=messages.InputScriptType.SPENDADDRESS,
|
||||
),
|
||||
"31jjHe38fsZ4HHuBbCbqpbrhsD3TxCCY4D",
|
||||
"0100000001b5f59e2273c85b93aa9deff9bba5d7deace78610d3b0fb892a7ba6d86f36ac0d000000006a47304402206c601351f1a21306ec4328da857cb7edbbe8c7b32e2ded19ad2888be3e010f7802200277a031944415a2f4d43b9dfb3f2aa7ee0f68603df91fc5356db8caa2557933012103d7f3a07085bee09697cf03125d5c8760dfed65403dba787f1d1d8b1251af2cbeffffffff0160ea00000000000017a91400835c51593132ba72c4e25b14fac7b412e6f2838700000000",
|
||||
),
|
||||
(
|
||||
messages.LightningNetworkSwapType(
|
||||
invoice="lnbc538340n1p3q7l23pp57vysk3kakcfynz09du0zy87zy7n4gc6czqettc7c5v9v2fsrs9nqdpa2pskjepqw3hjq3r0deshgefqw3hjqjzjgcs8vv3qyq5y7unyv4ezqj2y8gszjxqy9ghlcqpjsp50lm6njtrm9qlyaac8252x4s4l3eu0aryx7zjjw4zrq6hgpk2evwqrzjqtesdx359t3gswn09838tur09zjk5m4zutvk7kyg5vnxg3xu74ptvzhchqqq3kgqqyqqqqqqqqqqqqgq9q9qyyssqlg84727az93gg8n37gv994w3r6dj0u8dk55qjlstappyuehq3mqjcafkyj2a39xp0w34mnzy04hzqnct7fecd380wfa0kc0en8v006sqxqchh5",
|
||||
htlc=bytes.fromhex(
|
||||
"03bf9df301a514a83c0ccfea0e62951b19897fbb98f1612d56588edf1edc1bdf2a"
|
||||
),
|
||||
cltv=725893,
|
||||
swap_script_type=messages.InputScriptType.SPENDWITNESS,
|
||||
# 1JAd7XCBzGudGpJQSDSfpmJhiygtLQWaGL
|
||||
refund_address_n=parse_path("m/44h/0h/0h/0/0"),
|
||||
refund_script_type=messages.InputScriptType.SPENDADDRESS,
|
||||
),
|
||||
"bc1qagpvv4x8h5g0dr3v0fuvv43hqshchm8pa0fuhujkyc4sxz85fu8ssc08kc",
|
||||
"0100000001b5f59e2273c85b93aa9deff9bba5d7deace78610d3b0fb892a7ba6d86f36ac0d000000006a47304402200bb063f6d0c56fffdca77555bc63598c9ddbcbf80e9b5ba112648cfd62b681bb0220446ffc34429a62f675432cc037b138eeb8c8c518760b2f4618eac41caafe4f8f012103d7f3a07085bee09697cf03125d5c8760dfed65403dba787f1d1d8b1251af2cbeffffffff0160ea000000000000220020ea02c654c7bd10f68e2c7a78c65637042f8bece1ebd3cbf256262b0308f44f0f00000000",
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
def test_lnswap(client: Client):
|
||||
# input tx: 0dac366fd8a67b2a89fbb0d31086e7acded7a5bbf9ef9daa935bc873229ef5b5
|
||||
# address = 1H2CRJBrDMhkvCGZMW7T4oQwYbL8eVuh7p
|
||||
inp1 = messages.TxInputType(
|
||||
address_n=parse_path("m/44h/0h/5h/0/9"),
|
||||
amount=63_988,
|
||||
prev_hash=TXHASH_0dac36,
|
||||
prev_index=0,
|
||||
)
|
||||
|
||||
for lnswap, swap_address, tx in VECTORS:
|
||||
|
||||
out1 = messages.TxOutputType(
|
||||
script_type=messages.OutputScriptType.PAYTOLNSWAP,
|
||||
lnswap=lnswap,
|
||||
amount=60_000,
|
||||
address=swap_address,
|
||||
)
|
||||
|
||||
with client:
|
||||
_, serialized_tx = btc.sign_tx(
|
||||
client, "Bitcoin", [inp1], [out1], prev_txes=TX_CACHE_MAINNET
|
||||
)
|
||||
assert serialized_tx.hex() == tx
|
||||
if lnswap.swap_script_type == messages.InputScriptType.SPENDWITNESS:
|
||||
output_script = bytes.fromhex(tx[-76:-8])
|
||||
output_address = bech32.encode("bc", output_script[0], output_script[2:])
|
||||
else: # messages.InputScriptType.SPENDP2SHWITNESS
|
||||
output_script = tx[-54:-8]
|
||||
output_address = hash_160_to_bc_address(
|
||||
bytes.fromhex(output_script[4:-2]), 5
|
||||
)
|
||||
assert swap_address == output_address
|
Loading…
Reference in new issue