paths: compatibility for derivation paths checks

pull/25/head
Tomas Susanka 6 years ago committed by matejcik
parent da3223d703
commit f5af12c043

@ -17,6 +17,7 @@
import pytest
from trezorlib import ethereum, messages as proto
from trezorlib.tools import parse_path
from .common import TrezorTest
@ -56,7 +57,7 @@ class TestMsgEthereumSigntx(TrezorTest):
sig_v, sig_r, sig_s = ethereum.sign_tx(
self.client,
n=[0, 0],
n=parse_path("44'/60'/0'/0/0"),
nonce=0,
gas_price=20,
gas_limit=20,
@ -71,11 +72,11 @@ class TestMsgEthereumSigntx(TrezorTest):
# taken from T1 might not be 100% correct but still better than nothing
assert (
sig_r.hex()
== "75cf48fa173d8ceb68af9e4fb6b78ef69e6ed5e7679ba6f8e3e91d74b2fb0f96"
== "ec1df922115d256745410fbc2070296756583c8786e4d402a88d4e29ec513fa9"
)
assert (
sig_s.hex()
== "65de4a8c35263b2cfff3954b12146e8e568aa67a1c2461d6865e74ef75c7e190"
== "7001bfe3ba357e4a9f9e0d3a3f8a8962257615a4cf215db93e48b98999fc51b7"
)
def test_ethereum_signtx_unknown_erc20_token(self):
@ -109,7 +110,7 @@ class TestMsgEthereumSigntx(TrezorTest):
sig_v, sig_r, sig_s = ethereum.sign_tx(
self.client,
n=[0, 0],
n=parse_path("44'/60'/0'/0/1"),
nonce=0,
gas_price=20,
gas_limit=20,
@ -124,11 +125,11 @@ class TestMsgEthereumSigntx(TrezorTest):
# taken from T1 might not be 100% correct but still better than nothing
assert (
sig_r.hex()
== "1707471fbf632e42d18144157aaf4cde101cd9aa9782ad8e30583cfc95ddeef6"
== "2559bbf1bcb80992b6eaa96f0074b19606d8ea7bf4219e1c9ac64a12855c0cce"
)
assert (
sig_s.hex()
== "3d2e52ba5904a4bf131abde3f79db826199f5d6f4d241d531d7e8a30a3b9cfd9"
== "633a74429eb6d3aeec4ed797542236a85daab3cab15e37736b87a45697541d7a"
)
def test_ethereum_signtx_nodata(self):
@ -145,7 +146,7 @@ class TestMsgEthereumSigntx(TrezorTest):
sig_v, sig_r, sig_s = ethereum.sign_tx(
self.client,
n=[0, 0],
n=parse_path("44'/60'/0'/0/100"),
nonce=0,
gas_price=20,
gas_limit=20,
@ -156,11 +157,11 @@ class TestMsgEthereumSigntx(TrezorTest):
assert sig_v == 27
assert (
sig_r.hex()
== "9b61192a161d056c66cfbbd331edb2d783a0193bd4f65f49ee965f791d898f72"
== "2f548f63ddb4cf19b6b9f922da58ff71833b967d590f3b4dcc2a70810338a982"
)
assert (
sig_s.hex()
== "49c0bbe35131592c6ed5c871ac457feeb16a1493f64237387fab9b83c1a202f7"
== "428d35f0dca963b5196b63e7aa5e0405d8bff77d6aee1202183f1f68dacb4483"
)
with self.client:
@ -174,21 +175,21 @@ class TestMsgEthereumSigntx(TrezorTest):
sig_v, sig_r, sig_s = ethereum.sign_tx(
self.client,
n=[0, 0],
n=parse_path("44'/60'/0'/0/100"),
nonce=123456,
gas_price=20000,
gas_limit=20000,
to=TO_ADDR,
value=12345678901234567890,
)
assert sig_v == 28
assert sig_v == 27
assert (
sig_r.hex()
== "6de597b8ec1b46501e5b159676e132c1aa78a95bd5892ef23560a9867528975a"
== "3bf0470cd7f5ad8d82613199f73deadc55c3c9f32f91b1a21b5ef644144ebd58"
)
assert (
sig_s.hex()
== "6e33c4230b1ecf96a8dbb514b4aec0a6d6ba53f8991c8143f77812aa6daa993f"
== "48b3ef1b2502febdf35e9ff4df0ba1fda62f042fad639eb4852a297fc9872ebd"
)
def test_ethereum_signtx_data(self):
@ -206,7 +207,7 @@ class TestMsgEthereumSigntx(TrezorTest):
sig_v, sig_r, sig_s = ethereum.sign_tx(
self.client,
n=[0, 0],
n=parse_path("44'/60'/0'/0/0"),
nonce=0,
gas_price=20,
gas_limit=20,
@ -214,14 +215,14 @@ class TestMsgEthereumSigntx(TrezorTest):
value=10,
data=b"abcdefghijklmnop" * 16,
)
assert sig_v == 28
assert sig_v == 27
assert (
sig_r.hex()
== "6da89ed8627a491bedc9e0382f37707ac4e5102e25e7a1234cb697cedb7cd2c0"
== "e90f9e3dbfb34861d40d67570cb369049e675c6eebfdda6b08413a2283421b85"
)
assert (
sig_s.hex()
== "691f73b145647623e2d115b208a7c3455a6a8a83e3b4db5b9c6d9bc75825038a"
== "763912b8801f76cbea7792d98123a245514beeab2f3afebb4bab637888e8393a"
)
with self.client:
@ -245,7 +246,7 @@ class TestMsgEthereumSigntx(TrezorTest):
sig_v, sig_r, sig_s = ethereum.sign_tx(
self.client,
n=[0, 0],
n=parse_path("44'/60'/0'/0/0"),
nonce=123456,
gas_price=20000,
gas_limit=20000,
@ -253,14 +254,14 @@ class TestMsgEthereumSigntx(TrezorTest):
value=12345678901234567890,
data=b"ABCDEFGHIJKLMNOP" * 256 + b"!!!",
)
assert sig_v == 28
assert sig_v == 27
assert (
sig_r.hex()
== "4e90b13c45c6a9bf4aaad0e5427c3e62d76692b36eb727c78d332441b7400404"
== "dd96d82d791118a55601dfcede237760d2e9734b76c373ede5362a447c42ac48"
)
assert (
sig_s.hex()
== "3ff236e7d05f0f9b1ee3d70599bb4200638f28388a8faf6bb36db9e04dc544be"
== "60a77558f28d483d476f9507cd8a6a4bb47b86611aaff95fd5499b9ee9ebe7ee"
)
def test_ethereum_signtx_message(self):
@ -287,7 +288,7 @@ class TestMsgEthereumSigntx(TrezorTest):
sig_v, sig_r, sig_s = ethereum.sign_tx(
self.client,
n=[0, 0],
n=parse_path("44'/60'/0'/0/0"),
nonce=0,
gas_price=20000,
gas_limit=20000,
@ -295,14 +296,14 @@ class TestMsgEthereumSigntx(TrezorTest):
value=0,
data=b"ABCDEFGHIJKLMNOP" * 256 + b"!!!",
)
assert sig_v == 28
assert sig_v == 27
assert (
sig_r.hex()
== "070e9dafda4d9e733fa7b6747a75f8a4916459560efb85e3e73cd39f31aa160d"
== "81af16020d3c6ad820cab2e2b0834fa37f4a9b0c2443f151a4e2f12fe1081b09"
)
assert (
sig_s.hex()
== "7842db33ef15c27049ed52741db41fe3238a6fa3a6a0888fcfb74d6917600e41"
== "7b34b5d8a43771d493cd9fa0c7b27a9563e2a31799fb9f0c2809539a848b9f47"
)
def test_ethereum_signtx_newcontract(self):
@ -312,7 +313,7 @@ class TestMsgEthereumSigntx(TrezorTest):
with pytest.raises(Exception):
ethereum.sign_tx(
self.client,
n=[0, 0],
n=parse_path("44'/60'/0'/0/0"),
nonce=123456,
gas_price=20000,
gas_limit=20000,
@ -341,7 +342,7 @@ class TestMsgEthereumSigntx(TrezorTest):
sig_v, sig_r, sig_s = ethereum.sign_tx(
self.client,
n=[0, 0],
n=parse_path("44'/60'/0'/0/0"),
nonce=0,
gas_price=20000,
gas_limit=20000,
@ -349,14 +350,14 @@ class TestMsgEthereumSigntx(TrezorTest):
value=12345678901234567890,
data=b"ABCDEFGHIJKLMNOP" * 256 + b"!!!",
)
assert sig_v == 28
assert sig_v == 27
assert (
sig_r.hex()
== "b401884c10ae435a2e792303b5fc257a09f94403b2883ad8c0ac7a7282f5f1f9"
== "d043caa5f35e7676e0a9f9f0cd72a4055ae715309e8db8b3b6f1db928d276222"
)
assert (
sig_s.hex()
== "4742fc9e6a5fa8db3db15c2d856914a7f3daab21603a6c1ce9e9927482f8352e"
== "08b91becc7c4ffbea18fe499fb3289bc7384880c2f7d86f4e831191a286553f6"
)
def test_ethereum_sanity_checks(self):
@ -364,7 +365,7 @@ class TestMsgEthereumSigntx(TrezorTest):
with pytest.raises(Exception):
ethereum.sign_tx(
self.client,
n=[0, 0],
n=parse_path("44'/60'/0'/0/0"),
nonce=123456,
gas_price=0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,
gas_limit=0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF,

@ -13,7 +13,6 @@
#
# 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>.
import pytest
from trezorlib import lisk, messages as proto
@ -34,7 +33,40 @@ class TestMsgLiskSignTx(TrezorTest):
proto.ButtonRequest(code=proto.ButtonRequestType.ConfirmOutput),
proto.LiskSignedTx(
signature=bytes.fromhex(
"b62717d581e5713bca60b758b661e6cfa091addc6caedd57534e06cda805943ee80797b9fb9a1e1b2bd584e292d2a7f832a4d1b3f15f00e1ee1b72de7e195a08"
"6c96202c2271971917f9d8b752d6aa097084931bae2f2c92d2eeb3956310fb29c5bebeadf5707558b847d75a7f437998b9940aa76fb0d7b4fe40f09b4809970f"
)
),
]
)
lisk.sign_tx(
self.client,
parse_path("m/44'/134'/0'"),
{
"amount": "10000000",
"recipientId": "9971262264659915921L",
"timestamp": 57525937,
"type": 0,
"fee": "10000000",
"asset": {},
},
)
@pytest.mark.skip_t1
def test_lisk_sign_tx_send_wrong_path(self):
self.setup_mnemonic_nopin_nopassphrase()
with self.client:
self.client.set_expected_responses(
[
proto.ButtonRequest(
code=proto.ButtonRequestType.UnknownDerivationPath
),
proto.ButtonRequest(code=proto.ButtonRequestType.SignTx),
proto.ButtonRequest(code=proto.ButtonRequestType.ConfirmOutput),
proto.LiskSignedTx(
signature=bytes.fromhex(
"2cb9ce4b5e5add3b445272dd0def4719fcabfb169177ce705e856602ee414fc1a45e8ea0d1ae45bdc4e8283285b13d7a2e8776afb0e3ab50eeffe2c9ca67cc06"
)
),
]
@ -42,7 +74,7 @@ class TestMsgLiskSignTx(TrezorTest):
lisk.sign_tx(
self.client,
parse_path("m/44'/134'/0'/0'"),
parse_path("m/44'/9999'/0'"),
{
"amount": "10000000",
"recipientId": "9971262264659915921L",
@ -63,7 +95,7 @@ class TestMsgLiskSignTx(TrezorTest):
proto.ButtonRequest(code=proto.ButtonRequestType.ConfirmOutput),
proto.LiskSignedTx(
signature=bytes.fromhex(
"5dd0dbb87ee46f3e985b1ef2df85cb0bec481e8601d150388f73e198cdd57a698eab076c7cd5b281fbb6a83dd3dc64d91a6eccd1614dffd46f101194ffa3a004"
"8c36cbb03461cd574db2e9183b85f354f14f8a9b797a082b622bbd93c3504992e80bfcb20d93671843932c2d672e072ebcc139bb829bbdafedcc359230321b02"
)
),
]
@ -71,7 +103,7 @@ class TestMsgLiskSignTx(TrezorTest):
lisk.sign_tx(
self.client,
parse_path("m/44'/134'/0'/0'"),
parse_path("m/44'/134'/0'"),
{
"amount": "10000000",
"recipientId": "9971262264659915921L",
@ -92,7 +124,7 @@ class TestMsgLiskSignTx(TrezorTest):
proto.ButtonRequest(code=proto.ButtonRequestType.ConfirmOutput),
proto.LiskSignedTx(
signature=bytes.fromhex(
"f02bdc40a7599c21d29db4080ff1ff8934f76eedf5b0c4fa695c8a64af2f0b40a5c4f92db203863eebbbfad8f0611a23f451ed8bb711490234cdfb034728fd01"
"6b8d4af2f31d94c187dd7059c3bbbf0e98d0b0a5a278a1a71d3f42ed81c92d6e122b4bcf2e8829af081098adefca990972b7765cecca70745030e07f61de7909"
)
),
]
@ -100,7 +132,7 @@ class TestMsgLiskSignTx(TrezorTest):
lisk.sign_tx(
self.client,
parse_path("m/44'/134'/0'/0'"),
parse_path("m/44'/134'/0'"),
{
"amount": "0",
"timestamp": 57525937,
@ -124,7 +156,7 @@ class TestMsgLiskSignTx(TrezorTest):
proto.ButtonRequest(code=proto.ButtonRequestType.ConfirmOutput),
proto.LiskSignedTx(
signature=bytes.fromhex(
"5ac02b2882b9d7d0f944e48baadc27de1296cc08c3533f7c8e380fbbb9fb4a6ac81b5dc57060d7d8c68912eea24eb6e39024801bccc0d55020e2052b0c2bb701"
"9187f8156e8fc0bfe934002f0630cf9e9ef94f8880c796b8680b67ddeb15421f2a7880c0e23fa405cf3ed06459b856b9004aec916df58654b025bf5167e5dc0f"
)
),
]
@ -132,7 +164,7 @@ class TestMsgLiskSignTx(TrezorTest):
lisk.sign_tx(
self.client,
parse_path("m/44'/134'/0'/0'"),
parse_path("m/44'/134'/0'"),
{
"amount": "0",
"timestamp": 57525937,
@ -152,7 +184,7 @@ class TestMsgLiskSignTx(TrezorTest):
proto.ButtonRequest(code=proto.ButtonRequestType.ConfirmOutput),
proto.LiskSignedTx(
signature=bytes.fromhex(
"1d0599a8387edaa4a6d309b8a78accd1ceaff20ff9d87136b01cba0efbcb9781c13dc2b0bab5a1ea4f196d8dcc9dbdbd2d56dbffcc088fc77686b2e2c2fe560f"
"dfe9a12e14a12e6d411dba6eab91f69f7389eb3b04055f57218b997ccf72059fe151dd065d055e4c11205aa357f9b733958502ad7e8ab97cfeeda9b2edfa6a0b"
)
),
]
@ -160,7 +192,7 @@ class TestMsgLiskSignTx(TrezorTest):
lisk.sign_tx(
self.client,
parse_path("m/44'/134'/0'/0'"),
parse_path("m/44'/134'/0'"),
{
"amount": "0",
"timestamp": 57525937,
@ -185,7 +217,7 @@ class TestMsgLiskSignTx(TrezorTest):
proto.ButtonRequest(code=proto.ButtonRequestType.ConfirmOutput),
proto.LiskSignedTx(
signature=bytes.fromhex(
"88923866c2d500a6927715699ab41a0f58ea4b52e552d90e923bc24ac9da240f2328c93f9ce043a1da4937d4b61c7f57c02fc931f9824d06b24731e7be23c506"
"c97c94a4e6426e0d280e8279833110c5d5204beabde49865d73e21866ee9764da7f654257977e68ec6a9c5aa71214dec29ca331e64ae70853968c25b730ca403"
)
),
]
@ -193,7 +225,7 @@ class TestMsgLiskSignTx(TrezorTest):
lisk.sign_tx(
self.client,
parse_path("m/44'/134'/0'/0'"),
parse_path("m/44'/134'/0'"),
{
"amount": "0",
"timestamp": 57525937,

@ -67,7 +67,15 @@ TXHASH_2bac7a = bytes.fromhex(
)
def check_sign_tx(client, coin_name, inputs, outputs, fee_too_high=False, failure=None):
def check_sign_tx(
client,
coin_name,
inputs,
outputs,
fee_too_high=False,
failure=None,
unknown_path=False,
):
__tracebackhide__ = True
expected_responses = []
@ -87,10 +95,10 @@ def check_sign_tx(client, coin_name, inputs, outputs, fee_too_high=False, failur
return proto.ButtonRequest(code=code)
for i, inp in enumerate(inputs):
expected_responses += [
tx_request(t.TXINPUT, request_index=i),
tx_request(t.TXMETA, tx_hash=inp.prev_hash),
]
expected_responses.append(tx_request(t.TXINPUT, request_index=i))
if unknown_path and TREZOR_VERSION != 1:
expected_responses.append(btn(b.UnknownDerivationPath))
expected_responses.append(tx_request(t.TXMETA, tx_hash=inp.prev_hash))
if inp.script_type in (
proto.InputScriptType.SPENDP2SHWITNESS,
@ -163,7 +171,9 @@ class TestMsgSigntx(TrezorTest):
script_type=proto.OutputScriptType.PAYTOADDRESS,
)
_, serialized_tx = check_sign_tx(self.client, "Bitcoin", [inp1], [out1])
_, serialized_tx = check_sign_tx(
self.client, "Bitcoin", [inp1], [out1], unknown_path=True
)
# Accepted by network: tx fd79435246dee76b2f159d2db08032d666c95adc544de64c8c49f474df4a7fee
assert (
@ -229,7 +239,12 @@ class TestMsgSigntx(TrezorTest):
out2.force_confirm = True
_, serialized_tx = check_sign_tx(
self.client, "Testnet", [inp1], [out1, out2], fee_too_high=True
self.client,
"Testnet",
[inp1],
[out1, out2],
fee_too_high=True,
unknown_path=True,
)
assert (
@ -304,7 +319,7 @@ class TestMsgSigntx(TrezorTest):
out3.force_confirm = True
_, serialized_tx = check_sign_tx(
self.client, "Bitcoin", [inp1], [out1, out2, out3]
self.client, "Bitcoin", [inp1], [out1, out2, out3], unknown_path=True
)
assert (
@ -349,7 +364,7 @@ class TestMsgSigntx(TrezorTest):
out2.force_confirm = True
_, serialized_tx = check_sign_tx(
self.client, "Bitcoin", [inp1, inp2], [out1, out2]
self.client, "Bitcoin", [inp1, inp2], [out1, out2], unknown_path=True
)
# Accepted by network: tx c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb
@ -378,7 +393,9 @@ class TestMsgSigntx(TrezorTest):
amount=100 * 26000 - 15 * 10000,
script_type=proto.OutputScriptType.PAYTOADDRESS,
)
_, serialized_tx = check_sign_tx(self.client, "Bitcoin", inputs, [out])
_, serialized_tx = check_sign_tx(
self.client, "Bitcoin", inputs, [out], unknown_path=True
)
# Accepted by network: tx 23d9d8eecf3abf6c0f0f3f8b0976a04792d7f1c9a4ea9b0a8931734949e27c92
# too big put in unit test, only check hash
assert (
@ -420,7 +437,9 @@ class TestMsgSigntx(TrezorTest):
)
outputs.append(out)
_, serialized_tx = check_sign_tx(self.client, "Bitcoin", [inp1, inp2], outputs)
_, serialized_tx = check_sign_tx(
self.client, "Bitcoin", [inp1, inp2], outputs, unknown_path=True
)
assert (
serialized_tx.hex()
@ -450,7 +469,7 @@ class TestMsgSigntx(TrezorTest):
)
_, serialized_tx = check_sign_tx(
self.client, "Bitcoin", [inp1], [out1], fee_too_high=True
self.client, "Bitcoin", [inp1], [out1], fee_too_high=True, unknown_path=True
)
assert (
@ -484,6 +503,7 @@ class TestMsgSigntx(TrezorTest):
[inp1],
[out1],
failure=proto.FailureType.NotEnoughFunds,
unknown_path=True,
)
assert exc.value.args[0] == proto.FailureType.NotEnoughFunds
@ -503,7 +523,9 @@ class TestMsgSigntx(TrezorTest):
script_type=proto.OutputScriptType.PAYTOSCRIPTHASH,
)
_, serialized_tx = check_sign_tx(self.client, "Bitcoin", [inp1], [out1])
_, serialized_tx = check_sign_tx(
self.client, "Bitcoin", [inp1], [out1], unknown_path=True
)
# Accepted by network: tx 8cc1f4adf7224ce855cf535a5104594a0004cb3b640d6714fdb00b9128832dd5
assert (
@ -576,7 +598,7 @@ class TestMsgSigntx(TrezorTest):
out2.force_confirm = True
# Test if the transaction can be signed normally
_, serialized_tx = check_sign_tx(
self.client, "Bitcoin", [inp1, inp2], [out1, out2]
self.client, "Bitcoin", [inp1, inp2], [out1, out2], unknown_path=True
)
# Accepted by network: tx c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb
@ -656,7 +678,7 @@ class TestMsgSigntx(TrezorTest):
if not run_attack:
run_attack = True
else:
msg.tx.inputs[0].address_n[2] = H_(12345)
msg.tx.inputs[0].address_n[2] = H_(12)
return msg
@ -746,7 +768,9 @@ class TestMsgSigntx(TrezorTest):
script_type=proto.OutputScriptType.PAYTOADDRESS,
)
_, serialized_tx = check_sign_tx(self.client, "Testnet", [inp1], [out1])
_, serialized_tx = check_sign_tx(
self.client, "Testnet", [inp1], [out1], unknown_path=True
)
# Accepted by network: tx
assert (

@ -348,8 +348,7 @@ class TestMsgSigntxBch(TrezorTest):
def test_attack_change_input(self):
self.setup_mnemonic_allallall()
inp1 = proto.TxInputType(
address_n=parse_path("44'/145'/1000'/0/0"),
# bitcoincash:qr08q88p9etk89wgv05nwlrkm4l0urz4cyl36hh9sv
address_n=parse_path("44'/145'/10'/0/0"),
amount=1995344,
prev_hash=bytes.fromhex(
"bc37c28dfb467d2ecb50261387bf752a3977d7e5337915071bb4151e6b711a78"
@ -358,7 +357,7 @@ class TestMsgSigntxBch(TrezorTest):
script_type=proto.InputScriptType.SPENDADDRESS,
)
out1 = proto.TxOutputType(
address_n=parse_path("44'/145'/1000'/1/0"),
address_n=parse_path("44'/145'/10'/1/0"),
amount=1896050,
script_type=proto.OutputScriptType.PAYTOADDRESS,
)
@ -417,7 +416,7 @@ class TestMsgSigntxBch(TrezorTest):
xpubs = []
for n in map(
lambda index: btc.get_public_node(
self.client, parse_path("44'/145'/%d'" % index)
self.client, parse_path("48'/145'/%d'" % index)
),
range(1, 4),
):
@ -452,7 +451,7 @@ class TestMsgSigntxBch(TrezorTest):
"304402207274b5a4d15e75f3df7319a375557b0efba9b27bc63f9f183a17da95a6125c94022000efac57629f1522e2d3958430e2ef073b0706cfac06cce492651b79858f09ae"
)
inp1 = proto.TxInputType(
address_n=parse_path("44'/145'/1'/1/0"),
address_n=parse_path("48'/145'/1'/1/0"),
multisig=getmultisig(1, 0, [b"", sig, b""]),
# bitcoincash:pp6kcpkhua7789g2vyj0qfkcux3yvje7euhyhltn0a
amount=24000,
@ -463,7 +462,7 @@ class TestMsgSigntxBch(TrezorTest):
script_type=proto.InputScriptType.SPENDMULTISIG,
)
out1 = proto.TxOutputType(
address_n=parse_path("44'/145'/1'/1/1"),
address_n=parse_path("48'/145'/1'/1/1"),
multisig=proto.MultisigRedeemScriptType(
pubkeys=[
proto.HDNodePathType(node=deserialize(xpubs[0]), address_n=[1, 1]),
@ -505,11 +504,11 @@ class TestMsgSigntxBch(TrezorTest):
)
assert (
signatures1[0].hex()
== "3044022052ccf022b3684ecce9f961ce8828387b97267c86bedf0ce16a24bf014e62e42c022035d315ddbeeef7ab3456bd09aed8b625ea58852216b60e4b84ba9f85827d305c"
== "304402201badcdcafef4855ed58621f95935efcbc72068510472140f4ec5e252faa0af93022003310a43488288f70aedee96a5af2643a255268a6858cda9ae3001ea5e3c7557"
)
assert (
serialized_tx.hex()
== "01000000015f3d291cae106548f3be5ed0f4cbedc65668fa881d60347ab0d512df10af8cf601000000fc00473044022052ccf022b3684ecce9f961ce8828387b97267c86bedf0ce16a24bf014e62e42c022035d315ddbeeef7ab3456bd09aed8b625ea58852216b60e4b84ba9f85827d305c4147304402207274b5a4d15e75f3df7319a375557b0efba9b27bc63f9f183a17da95a6125c94022000efac57629f1522e2d3958430e2ef073b0706cfac06cce492651b79858f09ae414c69522103d62b2af2272bbd67cbe30eeaf4226c7f2d57d2a0ed1aab5ab736fb40bb2f5ffe21036d5e0d7ca3589465711eec91436249d7234d3a994c219024fc75cec98fc02ae221024f58378a69b68e89301a6ff882116e0fa35446ec9bfd86532eeb05941ec1f8c853aeffffffff01d85900000000000017a9140bb11de6558871f49fc241341992ece9986f7c5c8700000000"
== "01000000015f3d291cae106548f3be5ed0f4cbedc65668fa881d60347ab0d512df10af8cf601000000fc0047304402201badcdcafef4855ed58621f95935efcbc72068510472140f4ec5e252faa0af93022003310a43488288f70aedee96a5af2643a255268a6858cda9ae3001ea5e3c75574147304402207274b5a4d15e75f3df7319a375557b0efba9b27bc63f9f183a17da95a6125c94022000efac57629f1522e2d3958430e2ef073b0706cfac06cce492651b79858f09ae414c69522102245739b55787a27228a4fe78b3a324366cc645fbaa708cad45da351a334341192102debbdcb0b6970d5ade84a50fdbda1c701cdde5c9925d9b6cd8e05a9a15dbef352102ffe5fa04547b2b0c3cfbc21c08a1ddfb147025fee10274cdcd5c1bdeee88eae253aeffffffff01d85900000000000017a914a23eb2a1ed4003d357770120f5c370e199ee55468700000000"
)
def test_send_bch_multisig_change(self):
@ -517,7 +516,7 @@ class TestMsgSigntxBch(TrezorTest):
xpubs = []
for n in map(
lambda index: btc.get_public_node(
self.client, parse_path("44'/145'/%d'" % index)
self.client, parse_path("48'/145'/%d'" % index)
),
range(1, 4),
):
@ -538,9 +537,8 @@ class TestMsgSigntxBch(TrezorTest):
)
inp1 = proto.TxInputType(
address_n=parse_path("44'/145'/3'/0/0"),
address_n=parse_path("48'/145'/3'/0/0"),
multisig=getmultisig(0, 0),
# bitcoincash:pqguz4nqq64jhr5v3kvpq4dsjrkda75hwy86gq0qzw
amount=48490,
prev_hash=bytes.fromhex(
"8b6db9b8ba24235d86b053ea2ccb484fc32b96f89c3c39f98d86f90db16076a0"
@ -554,7 +552,7 @@ class TestMsgSigntxBch(TrezorTest):
script_type=proto.OutputScriptType.PAYTOADDRESS,
)
out2 = proto.TxOutputType(
address_n=parse_path("44'/145'/3'/1/0"),
address_n=parse_path("48'/145'/3'/1/0"),
multisig=getmultisig(1, 0),
script_type=proto.OutputScriptType.PAYTOMULTISIG,
amount=24000,
@ -597,11 +595,11 @@ class TestMsgSigntxBch(TrezorTest):
assert (
signatures1[0].hex()
== "3045022100bcb1a7134a13025a06052546ee1c6ac3640a0abd2d130190ed13ed7fcb43e9cd02207c381478e2ee123c850425bfbf6d3c691230eb37e333832cb32a1ed3f2cd9e85"
== "3045022100a05f77bb39515c21c43e6c4ba401f39ed5d409dc3cfcd90f9a8345a08cc4bc8202205faf8f3b0775748278495324fdd60f370460452e4995e546450209ec4804a0f3"
)
inp1 = proto.TxInputType(
address_n=parse_path("44'/145'/1'/0/0"),
address_n=parse_path("48'/145'/1'/0/0"),
multisig=getmultisig(0, 0, [b"", b"", signatures1[0]]),
# bitcoincash:pqguz4nqq64jhr5v3kvpq4dsjrkda75hwy86gq0qzw
amount=48490,
@ -651,9 +649,9 @@ class TestMsgSigntxBch(TrezorTest):
assert (
signatures1[0].hex()
== "3045022100f1153636371ba1f84389460e1265a8fa296569bc18e117c31f4e8f0fc0650c01022022932cc84766ff0c0f65ed9633ad311ae90d4c8fe71f5e1890b1e8f74dd516fa"
== "3044022006f239ef1f065a70873ab9d2c81a623a04ec7a37a0ec5299d3c585668f441f49022032b2f9ef13bc61230d14f6d79b9ad1bbebdf47b95e4757e9af1b1dcdf520d3ab"
)
assert (
serialized_tx.hex()
== "0100000001a07660b10df9868df9393c9cf8962bc34f48cb2cea53b0865d2324bab8b96d8b00000000fdfe0000483045022100f1153636371ba1f84389460e1265a8fa296569bc18e117c31f4e8f0fc0650c01022022932cc84766ff0c0f65ed9633ad311ae90d4c8fe71f5e1890b1e8f74dd516fa41483045022100bcb1a7134a13025a06052546ee1c6ac3640a0abd2d130190ed13ed7fcb43e9cd02207c381478e2ee123c850425bfbf6d3c691230eb37e333832cb32a1ed3f2cd9e85414c69522102fcf63419c319ce1a42d69120a3599d6da8c5dd4caf2888220eccde5a1ff7c5d021036d7d5ef79370b7fabe2c058698a20219e97fc70868e65ecdd6b37cc18e8a88bd2103505dc649dab8cd1655a4c0daf0ec5f955881c9d7011478ea881fac11cab1e49953aeffffffff02c05d0000000000001976a91400741952f6a6eab5394f366db5cc5a54b0c2429f88acc05d00000000000017a914756c06d7e77de3950a6124f026d8e1a2464b3ecf8700000000"
== "0100000001a07660b10df9868df9393c9cf8962bc34f48cb2cea53b0865d2324bab8b96d8b00000000fdfd0000473044022006f239ef1f065a70873ab9d2c81a623a04ec7a37a0ec5299d3c585668f441f49022032b2f9ef13bc61230d14f6d79b9ad1bbebdf47b95e4757e9af1b1dcdf520d3ab41483045022100a05f77bb39515c21c43e6c4ba401f39ed5d409dc3cfcd90f9a8345a08cc4bc8202205faf8f3b0775748278495324fdd60f370460452e4995e546450209ec4804a0f3414c69522102f8ca0d9665af03de32a7c19a167a4f6e97e4e0ed9505f75d11f7a45ab60b1f4d2103263d87cefd687bc15b4ef7801f9f538267b66d46f18e9fccc41d54071cfdd1ce210388568bf42f02298308eb6fa2fa4b446d544600253b4409be27e2c0c1a71c424853aeffffffff02c05d0000000000001976a91400741952f6a6eab5394f366db5cc5a54b0c2429f88acc05d00000000000017a91478574751407449b97f8054be2e40e684ad07d3738700000000"
)

@ -160,8 +160,7 @@ class TestMsgSigntxBitcoinGold(TrezorTest):
def test_attack_change_input(self):
self.setup_mnemonic_allallall()
inp1 = proto.TxInputType(
address_n=parse_path("44'/156'/1000'/0/0"),
# 1MH9KKcvdCTY44xVDC2k3fjBbX5Cz29N1q
address_n=parse_path("44'/156'/11'/0/0"),
amount=1995344,
prev_hash=bytes.fromhex(
"25526bf06c76ad3082bba930cf627cdd5f1b3cd0b9907dd7ff1a07e14addc985"
@ -170,7 +169,7 @@ class TestMsgSigntxBitcoinGold(TrezorTest):
script_type=proto.InputScriptType.SPENDADDRESS,
)
out1 = proto.TxOutputType(
address_n=parse_path("44'/156'/1000'/1/0"),
address_n=parse_path("44'/156'/11'/1/0"),
amount=1896050,
script_type=proto.OutputScriptType.PAYTOADDRESS,
)
@ -228,7 +227,7 @@ class TestMsgSigntxBitcoinGold(TrezorTest):
xpubs = []
for n in map(
lambda index: btc.get_public_node(
self.client, parse_path("44'/156'/%d'" % index)
self.client, parse_path("48'/156'/%d'" % index)
),
range(1, 4),
):
@ -249,7 +248,7 @@ class TestMsgSigntxBitcoinGold(TrezorTest):
)
inp1 = proto.TxInputType(
address_n=parse_path("44'/156'/3'/0/0"),
address_n=parse_path("48'/156'/3'/0/0"),
multisig=getmultisig(0, 0),
# 33Ju286QvonBz5N1V754ZekQv4GLJqcc5R
amount=48490,
@ -265,7 +264,7 @@ class TestMsgSigntxBitcoinGold(TrezorTest):
script_type=proto.OutputScriptType.PAYTOADDRESS,
)
out2 = proto.TxOutputType(
address_n=parse_path("44'/156'/3'/1/0"),
address_n=parse_path("48'/156'/3'/1/0"),
multisig=getmultisig(1, 0),
script_type=proto.OutputScriptType.PAYTOMULTISIG,
amount=24000,
@ -308,13 +307,12 @@ class TestMsgSigntxBitcoinGold(TrezorTest):
assert (
signatures[0].hex()
== "3045022100b1594f3b186d0dedbf61e53a1c407b1e0747098b7375941df85af045040f578e022013ba1893eb9e2fd854dd07073a83b261cf4beba76f66b07742e462b4088a7e4a"
== "3045022100d954f341ddd3ec96e4bc6cdb90f2df9b2032723f85e4a0187346dd743130bfca0220105ce08b795c70dc09a55569d7874bff684a877219ec2fc37c88cdffe12f332c"
)
inp1 = proto.TxInputType(
address_n=parse_path("44'/156'/1'/0/0"),
address_n=parse_path("48'/156'/1'/0/0"),
multisig=getmultisig(0, 0, [b"", b"", signatures[0]]),
# 33Ju286QvonBz5N1V754ZekQv4GLJqcc5R
amount=48490,
prev_hash=bytes.fromhex(
"25526bf06c76ad3082bba930cf627cdd5f1b3cd0b9907dd7ff1a07e14addc985"
@ -362,11 +360,11 @@ class TestMsgSigntxBitcoinGold(TrezorTest):
assert (
signatures[0].hex()
== "3044022006da8dbd14e6656ac8dcb956f4c0498574e88680eaeceb2cbafd8d2b2329d8cc02200972d076d444c5ff8f2ab18e14d8249ab661cb9c53335039bedcde037a40d747"
== "30440220614f9a18695365a2edba0d930404a77cae970d3430ad86c5b5239a96fd54bf84022030bc76a322e3b2b1c987622b5eb6da23ac1e6c905ee9b3b6405a4e4edd5bbb87"
)
assert (
serialized_tx.hex()
== "010000000185c9dd4ae1071affd77d90b9d03c1b5fdd7c62cf30a9bb8230ad766cf06b522500000000fdfd0000473044022006da8dbd14e6656ac8dcb956f4c0498574e88680eaeceb2cbafd8d2b2329d8cc02200972d076d444c5ff8f2ab18e14d8249ab661cb9c53335039bedcde037a40d74741483045022100b1594f3b186d0dedbf61e53a1c407b1e0747098b7375941df85af045040f578e022013ba1893eb9e2fd854dd07073a83b261cf4beba76f66b07742e462b4088a7e4a414c69522102290e6649574d17938c1ecb959ae92954f9ee48e1bd5b73f35ea931a3ab8a6087210379e0107b173e2c143426760627128c5eea3f862e8df92f3c2558eeeae4e347842103ff1746ca7dcf9e5c2eea9a73779b7c5bafed549f45cf3638a94cdf1e89c7f28f53aeffffffff02c05d0000000000001976a914ea5f904d195079a350b534db4446433b3cec222e88acc05d00000000000017a91445e917e46815d2b38d3f1cf072e63dd4f3b7a7e38700000000"
== "010000000185c9dd4ae1071affd77d90b9d03c1b5fdd7c62cf30a9bb8230ad766cf06b522500000000fdfd00004730440220614f9a18695365a2edba0d930404a77cae970d3430ad86c5b5239a96fd54bf84022030bc76a322e3b2b1c987622b5eb6da23ac1e6c905ee9b3b6405a4e4edd5bbb8741483045022100d954f341ddd3ec96e4bc6cdb90f2df9b2032723f85e4a0187346dd743130bfca0220105ce08b795c70dc09a55569d7874bff684a877219ec2fc37c88cdffe12f332c414c695221035a8db79c0ef57a202664a3da60ca41e8865c6d86ed0aafc03f8e75173341b58021037fba152d8fca660cc49973d8bc9421ff49a75b44ea200873d70d3990f763ed4c210348cbcbd93e069416e0d5db93e86b5698852d9fd54502ad0bed9722fa83f90e4b53aeffffffff02c05d0000000000001976a914ea5f904d195079a350b534db4446433b3cec222e88acc05d00000000000017a914623c803f7fb654dac8dda7786fbf9bc38cd867f48700000000"
)
def test_send_p2sh(self):
@ -506,7 +504,7 @@ class TestMsgSigntxBitcoinGold(TrezorTest):
self.setup_mnemonic_allallall()
nodes = map(
lambda index: btc.get_public_node(
self.client, parse_path("999'/1'/%d'" % index)
self.client, parse_path("49'/156'/%d'" % index)
),
range(1, 4),
)
@ -514,7 +512,7 @@ class TestMsgSigntxBitcoinGold(TrezorTest):
pubkeys=list(
map(
lambda n: proto.HDNodePathType(
node=deserialize(n.xpub), address_n=[2, 0]
node=deserialize(n.xpub), address_n=[1, 0]
),
nodes,
)
@ -524,7 +522,7 @@ class TestMsgSigntxBitcoinGold(TrezorTest):
)
inp1 = proto.TxInputType(
address_n=parse_path("999'/1'/1'/2/0"),
address_n=parse_path("49'/156'/1'/1/0"),
prev_hash=bytes.fromhex(
"25526bf06c76ad3082bba930cf627cdd5f1b3cd0b9907dd7ff1a07e14addc985"
),
@ -608,5 +606,5 @@ class TestMsgSigntxBitcoinGold(TrezorTest):
assert (
serialized_tx.hex()
== "0100000000010185c9dd4ae1071affd77d90b9d03c1b5fdd7c62cf30a9bb8230ad766cf06b522501000000232200201e8dda334f11171190b3da72e526d441491464769679a319a2f011da5ad312a1ffffffff01887d1800000000001976a914ea5f904d195079a350b534db4446433b3cec222e88ac0400483045022100e728485c8337f9a09ebbf36edc0fef10f8bcf5c1ba601b7d8ba43a9250a898f002206b9e3401c297f9ab9afb7f1be59bb342db53b5b65aff7c557e3109679697df0f41473044022062ea69ecdc07d0dadc1971fbda50a629a56dd30f431db26327428f4992601ce602204a1c8ab9c7d81c36cb6f819109a26f9baaa9607b8d37bff5e24eee6fab4a04e441695221038e81669c085a5846e68e03875113ddb339ecbb7cb11376d4163bca5dc2e2a0c1210348c5c3be9f0e6cf1954ded1c0475beccc4d26aaa9d0cce2dd902538ff1018a112103931140ebe0fbbb7df0be04ed032a54e9589e30339ba7bbb8b0b71b15df1294da53ae00000000"
== "0100000000010185c9dd4ae1071affd77d90b9d03c1b5fdd7c62cf30a9bb8230ad766cf06b52250100000023220020ea9ec48498c451286c2ebaf9e19255e2873b0fb517d67b2f2005298c7e437829ffffffff01887d1800000000001976a914ea5f904d195079a350b534db4446433b3cec222e88ac0400473044022077cb8b2a534f79328810ca8c330539ae9ffa086c359ddb7da11026557b04eef202201d95be0dd1da0aa01720953e52d5dabffd19a998d1490c13a21b8e52e4ead2e041483045022100e41cbd6a501ba8fe6f65554420e23e950d35af0da9b052da54a087463b0717ca02206c695c8d1f74f9535b5d89a2fd1f9326a0ef20e5400137f1e1daeee992b62b594169522103279aea0b253b144d1b2bb8532280001a996dcddd04f86e5e13df1355032cbc1321032c6465c956c0879663fa8be974c912d229c179a5cdedeb29611a1bec1f951eb22103494480a4b72101cbd2eadac8e18c7a3a7589a7f576bf46b8971c38c51e5eceeb53ae00000000"
)

@ -218,7 +218,7 @@ class TestMsgSigntxSegwit(TrezorTest):
self.setup_mnemonic_allallall()
nodes = map(
lambda index: btc.get_public_node(
self.client, parse_path("999'/1'/%d'" % index)
self.client, parse_path("49'/1'/%d'" % index)
),
range(1, 4),
)
@ -226,7 +226,7 @@ class TestMsgSigntxSegwit(TrezorTest):
pubkeys=list(
map(
lambda n: proto.HDNodePathType(
node=deserialize(n.xpub), address_n=[2, 0]
node=deserialize(n.xpub), address_n=[1, 0]
),
nodes,
)
@ -236,7 +236,7 @@ class TestMsgSigntxSegwit(TrezorTest):
)
inp1 = proto.TxInputType(
address_n=parse_path("999'/1'/1'/2/0"),
address_n=parse_path("49'/1'/1'/1/0"),
prev_hash=bytes.fromhex(
"9c31922be756c06d02167656465c8dc83bb553bf386a3f478ae65b5c021002be"
),
@ -320,7 +320,7 @@ class TestMsgSigntxSegwit(TrezorTest):
assert (
serialized_tx.hex()
== "01000000000101be0210025c5be68a473f6a38bf53b53bc88d5c46567616026dc056e72b92319c01000000232200201e8dda334f11171190b3da72e526d441491464769679a319a2f011da5ad312a1ffffffff01887d1800000000001976a91414fdede0ddc3be652a0ce1afbc1b509a55b6b94888ac040047304402205b44c20cf2681690edaaf7cd2e30d4704124dd8b7eb1fb7f459d3906c3c374a602205ca359b6544ce2c101c979899c782f7d141c3b0454ea69202b1fb4c09d3b715701473044022052fafa64022554ae436dbf781e550bf0d326fef31eea1438350b3ff1940a180102202851bd19203b7fe8582a9ef52e82aa9f61cd52d4bcedfe6dcc0cf782468e6a8e01695221038e81669c085a5846e68e03875113ddb339ecbb7cb11376d4163bca5dc2e2a0c1210348c5c3be9f0e6cf1954ded1c0475beccc4d26aaa9d0cce2dd902538ff1018a112103931140ebe0fbbb7df0be04ed032a54e9589e30339ba7bbb8b0b71b15df1294da53ae00000000"
== "01000000000101be0210025c5be68a473f6a38bf53b53bc88d5c46567616026dc056e72b92319c0100000023220020cf28684ff8a6dda1a7a9704dde113ddfcf236558da5ce35ad3f8477474dbdaf7ffffffff01887d1800000000001976a91414fdede0ddc3be652a0ce1afbc1b509a55b6b94888ac040047304402203fc3fbe6cd6250d82ace4a585debc07587c07d2efc8bb56558c91e1f810fe65402206025bd9a4e80960f617b6e5bfdd568e34aa085d093471b7976e6b14c2a2402a7014730440220327abf491a57964d75c67fad204eb782fa74aa4abde40e5ad30fb0b7696102b7022049e31f2302417be0a87e2f818b93a862a7e67d4178b7cbeee680264f0882113f0169522103d54ab3c8b81cb7f8f8088df4c62c105e8acaa2fb53b180f6bc6f922faecf3fdc21036aa47994f3f18f0976d6073ca79997003c3fa29c4f93907998fefc1151b4529b2102a092580f2828272517c402da9461425c5032860ab40180e041fbbb88ea2a520453ae00000000"
)
def test_attack_change_input_address(self):
@ -344,7 +344,7 @@ class TestMsgSigntxSegwit(TrezorTest):
script_type=proto.OutputScriptType.PAYTOADDRESS,
)
out2 = proto.TxOutputType(
address_n=parse_path("49'/1'/12345'/1/0"),
address_n=parse_path("49'/1'/12'/1/0"),
script_type=proto.OutputScriptType.PAYTOP2SHWITNESS,
amount=123456789 - 11000 - 12300000,
)
@ -393,7 +393,7 @@ class TestMsgSigntxSegwit(TrezorTest):
assert (
serialized_tx.hex()
== "0100000000010137c361fb8f2d9056ba8c98c5611930fcb48cacfdd0fe2e0449d83eea982f91200000000017160014d16b8c0680c61fc6ed2e407455715055e41052f5ffffffff02e0aebb00000000001976a91414fdede0ddc3be652a0ce1afbc1b509a55b6b94888ac3df39f060000000017a914dae9e09a7fc3bbe5a716fffec1bbb340b82a4fb9870248304502210099b5c4f8fd4402c9c0136fee5f711137d64fc9f14587e01bfa7798f5428f845d0220253e21c98f5b1b64efae69bc2ea9799c5620a43450baa6762a0c3cf4fdc886e5012103e7bfe10708f715e8538c92d46ca50db6f657bbc455b7494e6a0303ccdb868b7900000000"
== "0100000000010137c361fb8f2d9056ba8c98c5611930fcb48cacfdd0fe2e0449d83eea982f91200000000017160014d16b8c0680c61fc6ed2e407455715055e41052f5ffffffff02e0aebb00000000001976a91414fdede0ddc3be652a0ce1afbc1b509a55b6b94888ac3df39f060000000017a9142f98413cb83ff8b3eaf1926192e68973cbd68a3a8702473044022013cbce7c575337ca05dbe03b5920a0805b510cd8dfd3180bd7c5d01cec6439cd0220050001be4bcefb585caf973caae0ffec682347f2127cc22f26efd93ee54fd852012103e7bfe10708f715e8538c92d46ca50db6f657bbc455b7494e6a0303ccdb868b7900000000"
)
run_attack = True
@ -403,7 +403,7 @@ class TestMsgSigntxSegwit(TrezorTest):
if run_attack and msg.tx.inputs and msg.tx.inputs[0] == inp1:
run_attack = False
msg.tx.inputs[0].address_n[2] = H_(12345)
msg.tx.inputs[0].address_n[2] = H_(12)
return msg

@ -163,8 +163,7 @@ class TestMsgSigntxSegwitNative(TrezorTest):
def test_send_native(self):
self.setup_mnemonic_allallall()
inp1 = proto.TxInputType(
address_n=parse_path("49'/1'/0'/0/0"),
# tb1qqzv60m9ajw8drqulta4ld4gfx0rdh82un5s65s
address_n=parse_path("84'/1'/0'/0/0"),
amount=12300000,
prev_hash=bytes.fromhex(
"09144602765ce3dd8f4329445b20e3684e948709c5cdcaf12da3bb079c99448a"
@ -225,14 +224,13 @@ class TestMsgSigntxSegwitNative(TrezorTest):
assert (
serialized_tx.hex()
== "010000000001018a44999c07bba32df1cacdc50987944e68e3205b4429438fdde35c76024614090000000000ffffffff02404b4c000000000017a9147a55d61848e77ca266e79a39bfc85c580a6426c987a8386f0000000000160014d16b8c0680c61fc6ed2e407455715055e41052f502483045022100a7ca8f097525f9044e64376dc0a0f5d4aeb8d15d66808ba97979a0475b06b66502200597c8ebcef63e047f9aeef1a8001d3560470cf896c12f6990eec4faec599b950121033add1f0e8e3c3136f7428dd4a4de1057380bd311f5b0856e2269170b4ffa65bf00000000"
== "010000000001018a44999c07bba32df1cacdc50987944e68e3205b4429438fdde35c76024614090000000000ffffffff02404b4c000000000017a9147a55d61848e77ca266e79a39bfc85c580a6426c987a8386f0000000000160014d16b8c0680c61fc6ed2e407455715055e41052f502473044022073ce72dcf2f6e42eeb44adbe7d5038cf3763f168d1c04bd8b873a19b53331f51022016b051725731e7f53a567021bcd9c370727f551c81e857ebae7c128472119652012103adc58245cf28406af0ef5cc24b8afba7f1be6c72f279b642d85c48798685f86200000000"
)
def test_send_native_change(self):
self.setup_mnemonic_allallall()
inp1 = proto.TxInputType(
address_n=parse_path("49'/1'/0'/0/0"),
# tb1qqzv60m9ajw8drqulta4ld4gfx0rdh82un5s65s
address_n=parse_path("84'/1'/0'/0/0"),
amount=12300000,
prev_hash=bytes.fromhex(
"09144602765ce3dd8f4329445b20e3684e948709c5cdcaf12da3bb079c99448a"
@ -246,7 +244,7 @@ class TestMsgSigntxSegwitNative(TrezorTest):
script_type=proto.OutputScriptType.PAYTOADDRESS,
)
out2 = proto.TxOutputType(
address_n=parse_path("49'/1'/0'/1/0"),
address_n=parse_path("84'/1'/0'/1/0"),
script_type=proto.OutputScriptType.PAYTOWITNESS,
amount=12300000 - 11000 - 5000000,
)
@ -292,7 +290,7 @@ class TestMsgSigntxSegwitNative(TrezorTest):
assert (
serialized_tx.hex()
== "010000000001018a44999c07bba32df1cacdc50987944e68e3205b4429438fdde35c76024614090000000000ffffffff02404b4c000000000017a9147a55d61848e77ca266e79a39bfc85c580a6426c987a8386f0000000000160014d16b8c0680c61fc6ed2e407455715055e41052f502483045022100a7ca8f097525f9044e64376dc0a0f5d4aeb8d15d66808ba97979a0475b06b66502200597c8ebcef63e047f9aeef1a8001d3560470cf896c12f6990eec4faec599b950121033add1f0e8e3c3136f7428dd4a4de1057380bd311f5b0856e2269170b4ffa65bf00000000"
== "010000000001018a44999c07bba32df1cacdc50987944e68e3205b4429438fdde35c76024614090000000000ffffffff02404b4c000000000017a9147a55d61848e77ca266e79a39bfc85c580a6426c987a8386f0000000000160014cc8067093f6f843d6d3e22004a4290cd0c0f336b024730440220067675423ca6a0be3ddd5e13da00a9433775041e5cebc838873d2686f1d2840102201a5819e0312e6451d6b6180689101bce995685a51524cc4c3a5383f7bdab979a012103adc58245cf28406af0ef5cc24b8afba7f1be6c72f279b642d85c48798685f86200000000"
)
def test_send_both(self):
@ -308,8 +306,7 @@ class TestMsgSigntxSegwitNative(TrezorTest):
script_type=proto.InputScriptType.SPENDP2SHWITNESS,
)
inp2 = proto.TxInputType(
address_n=parse_path("49'/1'/0'/1/0"),
# tb1q694ccp5qcc0udmfwgp692u2s2hjpq5h407urtu
address_n=parse_path("84'/1'/0'/1/0"),
amount=7289000,
prev_hash=bytes.fromhex(
"65b811d3eca0fe6915d9f2d77c86c5a7f19bf66b1b1253c2c51cb4ae5f0c017b"
@ -401,23 +398,22 @@ class TestMsgSigntxSegwitNative(TrezorTest):
prev_txes=TX_API,
)
# 0e480a97c7a545c85e101a2f13c9af0e115d43734e1448f0cac3e55fe8e7399d
assert (
serialized_tx.hex()
== "010000000001028a44999c07bba32df1cacdc50987944e68e3205b4429438fdde35c76024614090100000017160014d16b8c0680c61fc6ed2e407455715055e41052f5ffffffff7b010c5faeb41cc5c253121b6bf69bf1a7c5867cd7f2d91569fea0ecd311b8650100000000ffffffff03e0aebb0000000000160014a579388225827d9f2fe9014add644487808c695d00cdb7020000000017a91491233e24a9bf8dbb19c1187ad876a9380c12e787870d859b03000000001976a914a579388225827d9f2fe9014add644487808c695d88ac02483045022100ead79ee134f25bb585b48aee6284a4bb14e07f03cc130253e83450d095515e5202201e161e9402c8b26b666f2b67e5b668a404ef7e57858ae9a6a68c3837e65fdc69012103e7bfe10708f715e8538c92d46ca50db6f657bbc455b7494e6a0303ccdb868b7902483045022100b4099ec4c7b3123795b3c080a86f4b745f3784eb3f77de79bef1d8da319cbee5022039766865d448a4a3e435a95d0df3ff56ebc6532bf538988a7e8a679b40ec41b6012103e7bfe10708f715e8538c92d46ca50db6f657bbc455b7494e6a0303ccdb868b7900000000"
== "010000000001028a44999c07bba32df1cacdc50987944e68e3205b4429438fdde35c76024614090100000017160014d16b8c0680c61fc6ed2e407455715055e41052f5ffffffff7b010c5faeb41cc5c253121b6bf69bf1a7c5867cd7f2d91569fea0ecd311b8650100000000ffffffff03e0aebb0000000000160014a579388225827d9f2fe9014add644487808c695d00cdb7020000000017a91491233e24a9bf8dbb19c1187ad876a9380c12e787870d859b03000000001976a914a579388225827d9f2fe9014add644487808c695d88ac02483045022100ead79ee134f25bb585b48aee6284a4bb14e07f03cc130253e83450d095515e5202201e161e9402c8b26b666f2b67e5b668a404ef7e57858ae9a6a68c3837e65fdc69012103e7bfe10708f715e8538c92d46ca50db6f657bbc455b7494e6a0303ccdb868b7902463043021f585c54a84dc7326fa60e22729accd41153c7dd4725bd4c8f751aa3a8cd8d6a0220631bfd83fc312cc6d5d129572a25178696d81eaf50c8c3f16c6121be4f4c029d012103505647c017ff2156eb6da20fae72173d3b681a1d0a629f95f49e884db300689f00000000"
)
def test_send_multisig_1(self):
self.setup_mnemonic_allallall()
nodes = [
btc.get_public_node(self.client, parse_path("999'/1'/%d'" % index))
btc.get_public_node(self.client, parse_path("49'/1'/%d'" % index))
for index in range(1, 4)
]
multisig = proto.MultisigRedeemScriptType(
pubkeys=list(
map(
lambda n: proto.HDNodePathType(
node=deserialize(n.xpub), address_n=[2, 0]
node=deserialize(n.xpub), address_n=[0, 0]
),
nodes,
)
@ -427,7 +423,7 @@ class TestMsgSigntxSegwitNative(TrezorTest):
)
inp1 = proto.TxInputType(
address_n=parse_path("999'/1'/1'/2/0"),
address_n=parse_path("49'/1'/1'/0/0"),
prev_hash=bytes.fromhex(
"9c31922be756c06d02167656465c8dc83bb553bf386a3f478ae65b5c021002be"
),
@ -509,23 +505,22 @@ class TestMsgSigntxSegwitNative(TrezorTest):
self.client, "Testnet", [inp1], [out1], prev_txes=TX_API
)
# f41cbedd8becee05a830f418d13aa665125464547db5c7a6cd28f21639fe1228
assert (
serialized_tx.hex()
== "01000000000101be0210025c5be68a473f6a38bf53b53bc88d5c46567616026dc056e72b92319c01000000232200201e8dda334f11171190b3da72e526d441491464769679a319a2f011da5ad312a1ffffffff01887d180000000000220020c5f4a0a4ea7c0392efe0a9670a73264cffa90b19107cd8a8e9750ff93c77fdfb0400483045022100a9b681f324ff4cf419ab06820d07248cc4e359c77334bf448ae7b5cdf3995ddf022039811f91f55b602368b4ba08a217b82bfd62d1a97dc635deb1457e7cfcc1550b0147304402201ad86a795c3d26881d696fa0a0619c24c4d505718132a82965cc2a609c9d8798022067cd490ce1366cde77e307ced5b13040bbc04991619ea6f49e06cece9a83268b01695221038e81669c085a5846e68e03875113ddb339ecbb7cb11376d4163bca5dc2e2a0c1210348c5c3be9f0e6cf1954ded1c0475beccc4d26aaa9d0cce2dd902538ff1018a112103931140ebe0fbbb7df0be04ed032a54e9589e30339ba7bbb8b0b71b15df1294da53ae00000000"
== "01000000000101be0210025c5be68a473f6a38bf53b53bc88d5c46567616026dc056e72b92319c01000000232200208d398cfb58a1d9cdb59ccbce81559c095e8c6f4a3e64966ca385078d9879f95effffffff01887d180000000000220020c5f4a0a4ea7c0392efe0a9670a73264cffa90b19107cd8a8e9750ff93c77fdfb0400483045022100dd6342c65197af27d7894d8b8b88b16b568ee3b5ebfdc55fdfb7caa9650e3b4c02200c7074a5bcb0068f63d9014c7cd2b0490aba75822d315d41aad444e9b86adf5201483045022100e7e6c2d21109512ba0609e93903e84bfb7731ac3962ee2c1cad54a7a30ff99a20220421497930226c39fc3834e8d6da3fc876516239518b0e82e2dc1e3c46271a17c01695221021630971f20fa349ba940a6ba3706884c41579cd760c89901374358db5dd545b92102f2ff4b353702d2bb03d4c494be19d77d0ab53d16161b53fbcaf1afeef4ad0cb52103e9b6b1c691a12ce448f1aedbbd588e064869c79fbd760eae3b8cd8a5f1a224db53ae00000000"
)
def test_send_multisig_2(self):
self.setup_mnemonic_allallall()
nodes = [
btc.get_public_node(self.client, parse_path("999'/1'/%d'" % index))
btc.get_public_node(self.client, parse_path("84'/1'/%d'" % index))
for index in range(1, 4)
]
multisig = proto.MultisigRedeemScriptType(
pubkeys=list(
map(
lambda n: proto.HDNodePathType(
node=deserialize(n.xpub), address_n=[2, 1]
node=deserialize(n.xpub), address_n=[0, 1]
),
nodes,
)
@ -535,7 +530,7 @@ class TestMsgSigntxSegwitNative(TrezorTest):
)
inp1 = proto.TxInputType(
address_n=parse_path("999'/1'/2'/2/1"),
address_n=parse_path("84'/1'/2'/0/1"),
prev_hash=bytes.fromhex(
"f41cbedd8becee05a830f418d13aa665125464547db5c7a6cd28f21639fe1228"
),
@ -617,23 +612,22 @@ class TestMsgSigntxSegwitNative(TrezorTest):
self.client, "Testnet", [inp1], [out1], prev_txes=TX_API
)
# c9348040bbc2024e12dcb4a0b4806b0398646b91acf314da028c3f03dd0179fc
assert (
serialized_tx.hex()
== "010000000001012812fe3916f228cda6c7b57d5464541265a63ad118f430a805eeec8bddbe1cf40000000000ffffffff01a0791800000000002200201e8dda334f11171190b3da72e526d441491464769679a319a2f011da5ad312a10400483045022100cc97f21a7cabc543a9b4ac52424e8f7e420622903f2417a1c08a6af68058ec4a02200baca0b222fc825078d94e8e1b55f174c4828bed16697e4281cda2a0c799eecf01473044022009b8058dc30fa7a13310dd8f1a99c4341c4cd95f771c5a41c4381f956e2344c102205e829c560c0184fd4b4db8971f99711e2a87409afa4df0840b4f12a87b2c8afc0169522102740ec30d0af8591a0dd4a3e3b274e57f3f73bdc0638a9603f9ee6ade0475ba57210311aada919974e882abf0c67b5c0fba00000b26997312ca00345027d22359443021029382591271a79d4b12365fa27c67fad3753150d8eaa987e5a12dc5ba1bb2fa1653ae00000000"
== "010000000001012812fe3916f228cda6c7b57d5464541265a63ad118f430a805eeec8bddbe1cf40000000000ffffffff01a0791800000000002200201e8dda334f11171190b3da72e526d441491464769679a319a2f011da5ad312a10400473044022001b7f4f21a8ddcd5e0faaaee3b95515bf8b84f2a7cbfdf66996c64123617a5cf02202fc6a776a7225420dbca759ad4ac83a61d15bf8d2883b6bf1aa31de7437f9b6e0147304402206c4125c1189a3b3e93a77cdf54c60c0538b80e5a03ec74e6ac776dfa77706ee4022035be14de76259b9d8a24863131a06a65b95df02f7d3ace90d52b37e8d94b167f0169522103bab8ecdd9ae2c51a0dc858f4c751b27533143bf6013ba1725ba8a4ecebe7de8c21027d5e55696c875308b03f2ca3d8637f51d3e35da9456a5187aa14b3de8a89534f2103b78eabaea8b3a4868be4f4bb96d6f66973f7081faa7f1cafba321444611c241e53ae00000000"
)
def test_send_multisig_3_change(self):
self.setup_mnemonic_allallall()
nodes = [
btc.get_public_node(self.client, parse_path("999'/1'/%d'" % index))
btc.get_public_node(self.client, parse_path("84'/1'/%d'" % index))
for index in range(1, 4)
]
multisig = proto.MultisigRedeemScriptType(
pubkeys=list(
map(
lambda n: proto.HDNodePathType(
node=deserialize(n.xpub), address_n=[2, 0]
node=deserialize(n.xpub), address_n=[1, 0]
),
nodes,
)
@ -655,7 +649,7 @@ class TestMsgSigntxSegwitNative(TrezorTest):
)
inp1 = proto.TxInputType(
address_n=parse_path("999'/1'/1'/2/0"),
address_n=parse_path("84'/1'/1'/1/0"),
prev_hash=bytes.fromhex(
"c9348040bbc2024e12dcb4a0b4806b0398646b91acf314da028c3f03dd0179fc"
),
@ -666,7 +660,7 @@ class TestMsgSigntxSegwitNative(TrezorTest):
)
out1 = proto.TxOutputType(
address_n=parse_path("999'/1'/1'/1/1"),
address_n=parse_path("84'/1'/1'/1/1"),
amount=1603000,
multisig=multisig2,
script_type=proto.OutputScriptType.PAYTOP2SHWITNESS,
@ -737,16 +731,15 @@ class TestMsgSigntxSegwitNative(TrezorTest):
self.client, "Testnet", [inp1], [out1], prev_txes=TX_API
)
# 31bc1c88ce6ae337a6b3057a16d5bad0b561ad1dfc047d0a7fbb8814668f91e5
assert (
serialized_tx.hex()
== "01000000000101fc7901dd033f8c02da14f3ac916b6498036b80b4a0b4dc124e02c2bb408034c90000000000ffffffff01b87518000000000017a914a8655acf68f785125561158b0f4db9b5d0044047870400473044022057b571986c07f8ccb231811334ad06ee6f87b722495def2e9511c1da46f3433202207b6e95bdd99e7fc7d319486437cb930d40a4af3cd753c4cb960b330badbf7f35014730440220517ecc6d0a2544276921d8fc2077aec4285ab83b1b21f5eb73cdb6187a0583e4022043fb5ab942f8981c04a54c66a57c4d291fad8514d4a8afea09f01f2db7a8f32901695221038e81669c085a5846e68e03875113ddb339ecbb7cb11376d4163bca5dc2e2a0c1210348c5c3be9f0e6cf1954ded1c0475beccc4d26aaa9d0cce2dd902538ff1018a112103931140ebe0fbbb7df0be04ed032a54e9589e30339ba7bbb8b0b71b15df1294da53ae00000000"
== "01000000000101fc7901dd033f8c02da14f3ac916b6498036b80b4a0b4dc124e02c2bb408034c90000000000ffffffff01b87518000000000017a914536250d41937e5b641082447580ff6a8e46c122a870400473044022003c26107a5a47f1f900ef8aa758977530cd13ea37a33971abae8d75cac2f9f34022039e2b8c2c1d0c24ff4fc026652e1f27ad8e3ed6c9bf485f61d9aa691cb57830801483045022100963b0dc0ab46e963a66ab6e69e5e41bac6c4fedc127cac12c560b029d54fe87402205b3bcdcf313dccd78e5dce0540e7d3c8cc1bf83f13c1f9f01811eb791fd35c8101695221039dba3a72f5dc3cad17aa924b5a03c34561465f997d0cb15993f2ca2c0be771c42103cd39f3f08bbd508dce4d307d57d0c70c258c285878bfda579fa260acc738c25d2102cd631ba95beca1d64766f5540885092d0bb384a3c13b6c3a5334d0ebacf51b9553ae00000000"
)
def test_send_multisig_4_change(self):
self.setup_mnemonic_allallall()
nodes = [
btc.get_public_node(self.client, parse_path("999'/1'/%d'" % index))
btc.get_public_node(self.client, parse_path("49'/1'/%d'" % index))
for index in range(1, 4)
]
multisig = proto.MultisigRedeemScriptType(
@ -775,7 +768,7 @@ class TestMsgSigntxSegwitNative(TrezorTest):
)
inp1 = proto.TxInputType(
address_n=parse_path("999'/1'/1'/1/1"),
address_n=parse_path("49'/1'/1'/1/1"),
prev_hash=bytes.fromhex(
"31bc1c88ce6ae337a6b3057a16d5bad0b561ad1dfc047d0a7fbb8814668f91e5"
),
@ -786,7 +779,7 @@ class TestMsgSigntxSegwitNative(TrezorTest):
)
out1 = proto.TxOutputType(
address_n=parse_path("999'/1'/1'/1/2"),
address_n=parse_path("49'/1'/1'/1/2"),
amount=1602000,
multisig=multisig2,
script_type=proto.OutputScriptType.PAYTOWITNESS,
@ -857,8 +850,7 @@ class TestMsgSigntxSegwitNative(TrezorTest):
self.client, "Testnet", [inp1], [out1], prev_txes=TX_API
)
# c0bf56060a109624b4635222696d94a7d533cacea1b3f8245417a4348c045829
assert (
serialized_tx.hex()
== "01000000000101e5918f661488bb7f0a7d04fc1dad61b5d0bad5167a05b3a637e36ace881cbc3100000000232200205b9824093eaf5cdcf8247c00dc0b557a7720957828fcde8384ac11f80a91f403ffffffff01d071180000000000220020e77caf5fbef07b1e461475c02afd4aed877693263d69c81e14617304349b629a040047304402204832553b0da1009da496881e58e8e2e41010cfe5c0161623048093f1b1a817b7022020dad8bf887acf574af80bfe4b39cd24e95019fd5e6b8ae967471e21ddc67354014830450221009e5d60847e7275edcf4619ed8ee462c56a042eef75d17da2d44e6b13d78e50e50220665195492900ef87a5eb8a924fa0ac9afc4fc75ca704ff356dc3a213979970c80169522103f4040006e3561b3e76c6d4113225c84748ab9d55ffd23f9578ab4c18fb0c3b9721020975f2e6922897ff6b80da6412a8d6ebd67e33c9611d081656a53ef967964e5021026b0546f23a6ce6b756c2c30b4176ce6f1c3268744f7aca82668d5116c4f764e453ae00000000"
== "01000000000101e5918f661488bb7f0a7d04fc1dad61b5d0bad5167a05b3a637e36ace881cbc310000000023220020fa6c73de618ec134eeec0c16f6dd04d46d4347e9a4fd0a95fd7938403a4949f9ffffffff01d071180000000000220020bcea2324dacbcde5a9db90cc26b8df9cbc72010e05cb68cf034df6f0e05239a2040047304402206bbddb45f12e31e77610fd85b50a83bad4426433b1c4860b1c5ddc0a69f803720220087b0607daab14830f4b4941f16b953b38e606ad70029bac24af7267f93c4242014730440220551a0cb6b0d5b3fa0cfd0b07bb5d751494b827b1c6a08702186696cfbc18278302204f37c382876c4117cca656654599b508f2d55fc3b083dc938e3cd8491b29719601695221036a5ec3abd10501409092246fe59c6d7a15fff1a933479483c3ba98b866c5b9742103559be875179d44e438db2c74de26e0bc9842cbdefd16018eae8a2ed989e474722103067b56aad037cd8b5f569b21f9025b76470a72dc69457813d2b76e98dc0cd01a53ae00000000"
)

@ -17,9 +17,10 @@
import pytest
from trezorlib import btc, messages as proto
from trezorlib.tools import CallException
from trezorlib.tools import CallException, parse_path
from ..support import ckd_public as bip32
from ..support.ckd_public import deserialize
from ..support.tx_cache import tx_cache
from .common import TrezorTest
@ -30,54 +31,29 @@ TXHASH_c6091a = bytes.fromhex(
)
# Multisig howto:
#
# https://sx.dyne.org/multisig.html
#
class TestMultisig(TrezorTest):
def test_2_of_3(self):
self.setup_mnemonic_nopin_nopassphrase()
# key1 = self.client.get_public_node([1])
# key2 = self.client.get_public_node([2])
# key3 = self.client.get_public_node([3])
# xpub:
# print(bip32.serialize(self.client.get_public_node([]).node))
# xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy
# pubkeys:
# xpub/1: 0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6
# xpub/2: 038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3
# xpub/3: 03477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902
# redeem script:
# 52210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a621038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e32103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a790253ae
# multisig address: 3E7GDtuHqnqPmDgwH59pVC7AvySiSkbibz
# tx: c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52
# input 1: 0.001 BTC
node = bip32.deserialize(
"xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy"
)
self.setup_mnemonic_allallall()
nodes = [
btc.get_public_node(self.client, parse_path("48'/0'/%d'" % index))
for index in range(1, 4)
]
multisig = proto.MultisigRedeemScriptType(
pubkeys=[
proto.HDNodePathType(node=node, address_n=[1]),
proto.HDNodePathType(node=node, address_n=[2]),
proto.HDNodePathType(node=node, address_n=[3]),
],
pubkeys=list(
map(
lambda n: proto.HDNodePathType(
node=deserialize(n.xpub), address_n=[0, 0]
),
nodes,
)
),
signatures=[b"", b"", b""],
m=2,
)
# Let's go to sign with key 1
inp1 = proto.TxInputType(
address_n=[1],
address_n=parse_path("48'/0'/1'/0/0"),
prev_hash=TXHASH_c6091a,
prev_index=1,
script_type=proto.InputScriptType.SPENDMULTISIG,
@ -148,18 +124,21 @@ class TestMultisig(TrezorTest):
assert (
signatures1[0].hex()
== "3045022100985cc1ba316d140eb4b2d4028d8cd1c451f87bff8ff679858732e516ad04cd3402207af6edda99972af0baa7702a3b7448517c8242e7bca669f6861771cdd16ee058"
== "3044022052f4a3dc5ca3e86ed66abb1e2b4d9b9ace7d96f5615944beea19e58280847c2902201bd3ff32a38366a4eed0373e27da26ebc0d2a4c2bbeffd83e8a60e313d95b9e3"
)
# ---------------------------------------
# Let's do second signature using 3rd key
multisig = proto.MultisigRedeemScriptType(
pubkeys=[
proto.HDNodePathType(node=node, address_n=[1]),
proto.HDNodePathType(node=node, address_n=[2]),
proto.HDNodePathType(node=node, address_n=[3]),
],
pubkeys=list(
map(
lambda n: proto.HDNodePathType(
node=deserialize(n.xpub), address_n=[0, 0]
),
nodes,
)
),
signatures=[
signatures1[0],
b"",
@ -170,7 +149,7 @@ class TestMultisig(TrezorTest):
# Let's do a second signature with key 3
inp3 = proto.TxInputType(
address_n=[3],
address_n=parse_path("48'/0'/3'/0/0"),
prev_hash=TXHASH_c6091a,
prev_index=1,
script_type=proto.InputScriptType.SPENDMULTISIG,
@ -233,13 +212,12 @@ class TestMultisig(TrezorTest):
assert (
signatures2[0].hex()
== "3045022100f5428fe0531b3095675b40d87cab607ee036fac823b22e8dcec35b65aff6e52b022032129b4577ff923d321a1c70db5a6cec5bcc142cb2c51901af8b989cced23e0d"
== "304402203828fd48540811be6a1b12967e7012587c46e6f05c78d42471e7b25c06bc7afc0220749274bc1aa698335b00400c5ba946a70b6b46c711324fbc4989279737a57f49"
)
# Accepted by network: tx 8382a2b2e3ec8788800c1d46d285dfa9dd4051edddd75982fad166b9273e5ac6
assert (
serialized_tx.hex()
== "010000000152ba4dfcde9c4bed88f55479cdea03e711ae586e9a89352a98230c4cdf1a09c601000000fdfe0000483045022100985cc1ba316d140eb4b2d4028d8cd1c451f87bff8ff679858732e516ad04cd3402207af6edda99972af0baa7702a3b7448517c8242e7bca669f6861771cdd16ee05801483045022100f5428fe0531b3095675b40d87cab607ee036fac823b22e8dcec35b65aff6e52b022032129b4577ff923d321a1c70db5a6cec5bcc142cb2c51901af8b989cced23e0d014c6952210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a621038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e32103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a790253aeffffffff01a0860100000000001976a91412e8391ad256dcdc023365978418d658dfecba1c88ac00000000"
== "010000000152ba4dfcde9c4bed88f55479cdea03e711ae586e9a89352a98230c4cdf1a09c601000000fc00473044022052f4a3dc5ca3e86ed66abb1e2b4d9b9ace7d96f5615944beea19e58280847c2902201bd3ff32a38366a4eed0373e27da26ebc0d2a4c2bbeffd83e8a60e313d95b9e30147304402203828fd48540811be6a1b12967e7012587c46e6f05c78d42471e7b25c06bc7afc0220749274bc1aa698335b00400c5ba946a70b6b46c711324fbc4989279737a57f49014c6952210203ed6187880ae932660086e55d4561a57952dd200aa3ed2aa66b73e5723a0ce7210360e7f32fd3c8dee27a166f6614c598929699ee66acdcbda5fb24571bf2ae1ca021037c4c7e5d3293ab0f97771dcfdf83caadab341f427f54713da8b2c590a834f03b53aeffffffff01a0860100000000001976a91412e8391ad256dcdc023365978418d658dfecba1c88ac00000000"
)
def test_15_of_15(self):

@ -20,6 +20,7 @@ from trezorlib.tools import H_, parse_path
from ..support import ckd_public as bip32
from ..support.tx_cache import tx_cache
from .common import TrezorTest
from .conftest import TREZOR_VERSION
TX_API = tx_cache("Testnet")
@ -135,7 +136,15 @@ class TestMultisigChange(TrezorTest):
proto.TxRequest(
request_type=proto.RequestType.TXINPUT,
details=proto.TxRequestDetailsType(request_index=0),
),
)
]
if TREZOR_VERSION != 1:
# trezor 1 does not have UnknownDerivationPath implemented
resp.append(
proto.ButtonRequest(code=proto.ButtonRequestType.UnknownDerivationPath)
)
resp += [
proto.TxRequest(
request_type=proto.RequestType.TXMETA,
details=proto.TxRequestDetailsType(tx_hash=inp1.prev_hash),
@ -162,6 +171,14 @@ class TestMultisigChange(TrezorTest):
request_type=proto.RequestType.TXINPUT,
details=proto.TxRequestDetailsType(request_index=1),
),
]
if TREZOR_VERSION != 1:
# trezor 1 does not have UnknownDerivationPath implemented
resp.append(
proto.ButtonRequest(code=proto.ButtonRequestType.UnknownDerivationPath)
)
resp += [
proto.TxRequest(
request_type=proto.RequestType.TXMETA,
details=proto.TxRequestDetailsType(tx_hash=inp2.prev_hash),

@ -17,7 +17,7 @@
import pytest
from trezorlib import btc, messages as proto
from trezorlib.tools import CallException
from trezorlib.tools import CallException, parse_path
from ..support.tx_cache import tx_cache
from .common import TrezorTest
@ -32,16 +32,10 @@ TXHASH_d5f65e = bytes.fromhex(
class TestOpReturn(TrezorTest):
def test_opreturn(self):
self.setup_mnemonic_nopin_nopassphrase()
# tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882
# input 0: 0.0039 BTC
self.setup_mnemonic_allallall()
inp1 = proto.TxInputType(
address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e
# amount=390000,
prev_hash=TXHASH_d5f65e,
prev_index=0,
address_n=parse_path("44'/0'/0'/0/2"), prev_hash=TXHASH_d5f65e, prev_index=0
)
out1 = proto.TxOutputType(
@ -125,18 +119,14 @@ class TestOpReturn(TrezorTest):
assert (
serialized_tx.hex()
== "010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006a4730440220187b7b9c340a32fc8445418ad11fb3827d2e8bac7d730e1c9ad800353e7ba62f02206c0c5820ba8882c82923a39aee8d36d6d32e13daed73f7a3d6199de5f8e7ddfd0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0260cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000000000001c6a1a74657374206f6620746865206f705f72657475726e206461746100000000"
== "010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100bc36e1227b334e856c532bbef86d30a96823a5f2461738f4dbf969dfbcf1b40b022078c5353ec9a4bce2bb05bd1ec466f2ab379c1aad926e208738407bba4e09784b012103330236b68aa6fdcaca0ea72e11b360c84ed19a338509aa527b678a7ec9076882ffffffff0260cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000000000001c6a1a74657374206f6620746865206f705f72657475726e206461746100000000"
)
def test_nonzero_opreturn(self):
self.setup_mnemonic_nopin_nopassphrase()
# tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882
# input 0: 0.0039 BTC
self.setup_mnemonic_allallall()
inp1 = proto.TxInputType(
address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e
# amount=390000,
address_n=parse_path("44'/0'/10'/0/5"),
prev_hash=TXHASH_d5f65e,
prev_index=0,
)

Loading…
Cancel
Save