Updated multisig change test

Use BIP-45 paths with correct change addresses.
This fixes #154.
This commit is contained in:
Jochen Hoenicke 2017-11-17 16:33:16 +01:00 committed by Pavol Rusnak
parent 225160d7bd
commit 99af1639a6
4 changed files with 93 additions and 82 deletions

View File

@ -23,24 +23,29 @@ import binascii
import trezorlib.messages_pb2 as proto
import trezorlib.ckd_public as bip32
import trezorlib.types_pb2 as proto_types
from trezorlib import tx_api
class TestMultisigChange(common.TrezorTest):
node_ext1 = bip32.deserialize('xpub6E2LkiC2h7icfcjXPFDmwufDRaaTjTRYcS2nD7eGQeFx1WwZxxvCya5GefiJND6ddJnAjzzMusLcCnu6WyhZPrF6e5G71MWjNJVfs6u9csg')
def setUp(self):
super(TestMultisigChange, self).setUp()
self.client.set_tx_api(tx_api.TxApiTestnet)
node_ext1 = bip32.deserialize('tpubDADHV9u9Y6gkggintTdMjJE3be58zKNLhpxBQyuEM6Pwx3sN9JVLmMCMN4DNVwL9AKec27z5TaWcWuHzMXiGAtcra5DjwWbvppGX4gaEGVN')
# m/1 => 02c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e
# m/2 => 0375b9dfaad928ce1a7eed88df7c084e67d99e9ab74332419458a9a45779706801
node_ext2 = bip32.deserialize('xpub6FKKCwdfD85eHmKn7d3mmbhqsHnGkB2n7Hmre29gbnR1cR4U1wrtf2akh1VVqjcTdfkxmwPjQyYPhLLgwBijfFPAYqTZzcjj4awB1BMUxq2')
node_ext2 = bip32.deserialize('tpubDADHV9u9Y6gkhWXBmDJ6TUhZajLWjvKukRe2w9FfhdbQpUux8Z8jnPHNAZqFRgHPg9sR7YR93xThM32M7NfRu8S5WyDtext7S62sqxeJNkd')
# m/1 => 0388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1
# m/2 => 03a04f945d5a3685729dde697d574076de4bdf38e904f813b22a851548e1110fc0
node_ext3 = bip32.deserialize('xpub69rsKg2fef3GzETrukhsR3U9i4nL3dXKy3cjSpm44Cg8waqrnyupanaLQt4bYjn2HTmH1NusFt9DAh6absMQqE4E66q7EYTyEsorZKXdWWx')
node_ext3 = bip32.deserialize('tpubDADHV9u9Y6gkmM5ohWRGTswrc6fr7soH7e2D2ic5a86PDUaHc5Ln9EbER69cEr5bDZPa7EXguJ1MhWVzPZpZWVdG5fvoF3hfirXvRbpCCBg')
# m/1 => 02e0c21e2a7cf00b94c5421725acff97f9826598b91f2340c5ddda730caca7d648
# m/2 => 03928301ffb8c0d7a364b794914c716ba3107cc78a6fe581028b0d8638b22e8573
node_int = bip32.deserialize('xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy')
# m/1 => 0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6
node_int = bip32.deserialize('tpubDADHV9u9Y6gke2Vw3rWE8KRXmeK8PTtsF5B3Cqjo6h3SoiyRtzxjnDVG1knxrqB8BpP1dMAd6MR3Ps5UXibiFDtQuWVPXLkJ3HvttZYbH12')
# m/1 => 03f91460d79e4e463d7d90cb75254bcd62b515a99a950574c721efdc5f711dff35
# m/2 => 038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3
# ext1 + ext2 + int
@ -63,9 +68,9 @@ class TestMultisigChange(common.TrezorTest):
multisig_in1 = proto_types.MultisigRedeemScriptType(
pubkeys=[
proto_types.HDNodePathType(node=node_ext1, address_n=[1]),
proto_types.HDNodePathType(node=node_ext2, address_n=[1]),
proto_types.HDNodePathType(node=node_int, address_n=[1])
proto_types.HDNodePathType(node=node_ext2, address_n=[0, 0]),
proto_types.HDNodePathType(node=node_ext1, address_n=[0, 0]),
proto_types.HDNodePathType(node=node_int, address_n=[0, 0])
],
signatures=[b'', b'', b''],
m=2,
@ -73,9 +78,9 @@ class TestMultisigChange(common.TrezorTest):
multisig_in2 = proto_types.MultisigRedeemScriptType(
pubkeys=[
proto_types.HDNodePathType(node=node_ext1, address_n=[1]),
proto_types.HDNodePathType(node=node_int, address_n=[1]),
proto_types.HDNodePathType(node=node_ext2, address_n=[1])
proto_types.HDNodePathType(node=node_ext1, address_n=[0, 1]),
proto_types.HDNodePathType(node=node_ext2, address_n=[0, 1]),
proto_types.HDNodePathType(node=node_int, address_n=[0, 1]),
],
signatures=[b'', b'', b''],
m=2,
@ -83,34 +88,37 @@ class TestMultisigChange(common.TrezorTest):
multisig_in3 = proto_types.MultisigRedeemScriptType(
pubkeys=[
proto_types.HDNodePathType(node=node_ext1, address_n=[1]),
proto_types.HDNodePathType(node=node_ext3, address_n=[1]),
proto_types.HDNodePathType(node=node_int, address_n=[1])
proto_types.HDNodePathType(node=node_ext1, address_n=[0, 1]),
proto_types.HDNodePathType(node=node_ext3, address_n=[0, 1]),
proto_types.HDNodePathType(node=node_int, address_n=[0, 1])
],
signatures=[b'', b'', b''],
m=2,
)
# 2N9W4z9AhAPaHghtqVQPbaTAGHdbrhKeBQw
inp1 = proto_types.TxInputType(
address_n=[1],
prev_hash=binascii.unhexlify('d1d08ea63255af4ad16b098e9885a252632086fa6be53301521d05253ce8a73d'),
prev_index=0,
address_n=[45 | 0x80000000, 0, 0, 0],
prev_hash=binascii.unhexlify('16c6c8471b8db7a628f2b2bb86bfeefae1766463ce8692438c7fd3fce3f43ce5'),
prev_index=1,
script_type=proto_types.SPENDMULTISIG,
multisig=multisig_in1,
)
# 2NDBG6QXQLtnQ3jRGkrqo53BiCeXfQXLdj4
inp2 = proto_types.TxInputType(
address_n=[1],
prev_hash=binascii.unhexlify('a6e2829d089cee47e481b1a753a53081b40738cc87e38f1d9b23ab57d9ad4396'),
address_n=[45 | 0x80000000, 0, 0, 1],
prev_hash=binascii.unhexlify('d80c34ee14143a8bf61125102b7ef594118a3796cad670fa8ee15080ae155318'),
prev_index=0,
script_type=proto_types.SPENDMULTISIG,
multisig=multisig_in2,
)
# 2MvwPWfp2XPU3S1cMwgEMKBPUw38VP5SBE4
inp3 = proto_types.TxInputType(
address_n=[1],
prev_hash=binascii.unhexlify('e4bc1ae5e5007a08f2b3926fe11c66612e8f73c6b00c69c7027213b84d259be3'),
prev_index=1,
address_n=[45 | 0x80000000, 0, 0, 1],
prev_hash=binascii.unhexlify('b0946dc27ba308a749b11afecc2018980af18f79e89ad6b080b58220d856f739'),
prev_index=0,
script_type=proto_types.SPENDMULTISIG,
multisig=multisig_in3,
)
@ -161,88 +169,88 @@ class TestMultisigChange(common.TrezorTest):
self.setup_mnemonic_nopin_nopassphrase()
out1 = proto_types.TxOutputType(
address='12iyMbUb4R2K3gre4dHSrbu5azG5KaqVss',
amount=100000,
address='muevUcG1Bb8eM2nGUGhqmeujHRX7YXjSEu',
amount=40000000,
script_type=proto_types.PAYTOADDRESS
)
out2 = proto_types.TxOutputType(
address='17kTB7qSk3MupQxWdiv5ZU3zcrZc2Azes1',
amount=100000,
address='mwdrpMVSJxxsM8f8xbnCHn9ERaRT1NG1UX',
amount=44000000,
script_type=proto_types.PAYTOADDRESS
)
with self.client:
self.client.set_expected_responses(self._responses(self.inp1, self.inp2))
(_, serialized_tx) = self.client.sign_tx('Bitcoin', [self.inp1, self.inp2, ], [out1, out2, ])
(_, serialized_tx) = self.client.sign_tx('Testnet', [self.inp1, self.inp2, ], [out1, out2, ])
self.assertEqual(binascii.hexlify(serialized_tx), b'01000000023da7e83c25051d520133e56bfa86206352a285988e096bd14aaf5532a68ed0d100000000b500483045022100c4116c9a584083021dacb690d4d4938027cc3f2085dc15157162b589f2a0b52f02200bdec59f76376255afc7b76f759106f6f00edf0134db2a0ae5d28000ea517fd2014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653aeffffffff9643add957ab239b1d8fe387cc3807b48130a553a7b181e447ee9c089d82e2a600000000b400473044022044e77c67a5a78c8eb4f304cf23972a7763cce6f7dc3587d6e77e2aa05212ea6402200be874d39c32ad2475d03342cb0b164ec618297231c519186e3d0efde7a3374d014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c153aeffffffff02a0860100000000001976a91412e8391ad256dcdc023365978418d658dfecba1c88aca0860100000000001976a9144a087d89f8ad16ca029c675b037c02fd1c5f9aec88ac00000000')
self.assertEqual(binascii.hexlify(serialized_tx), b'0100000002e53cf4e3fcd37f8c439286ce636476e1faeebf86bbb2f228a6b78d1b47c8c61601000000b400473044022064f13801744a6c21b694f62cdb5d834e852f13ecf85ed4d0a56ba279571c24e3022010fab4cb05bdd7b24c8376dda4f62a418548eea6eb483e58675fa06e0d5c642c014c69522103dc07026aacb5918dac4e09f9da8290d0ae22161699636c22cace78082116a7792103e70db185fad69c2971f0107a42930e5d82a9ed3a11b922a96fdfc4124b63e54c2103f3fe007a1e34ac76c1a2528e9149f90f9f93739929797afab6a8e18d682fa71053aeffffffff185315ae8050e18efa70d6ca96378a1194f57e2b102511f68b3a1414ee340cd800000000b4004730440220727b2522268f913acd213c507d7801b146e5b6cef666ad44b769c26d6c762e4d022021c0c2e9e8298dee2a490d956f7ab1b2d3160c1e37a50cc6d19a5e62eb484fc9014c6952210297ad8a5df42f9e362ef37d9a4ddced89d8f7a143690649aa0d0ff049c7daca842103ed1fd93989595d7ad4b488efd05a22c0239482c9a20923f2f214a38e54f6c41a2103f91460d79e4e463d7d90cb75254bcd62b515a99a950574c721efdc5f711dff3553aeffffffff02005a6202000000001976a9149b139230e4fe91c05a37ec334dc8378f3dbe377088ac00639f02000000001976a914b0d05a10926a7925508febdbab9a5bd4cda8c8f688ac00000000')
# first external, second internal
def test_external_internal(self):
self.setup_mnemonic_nopin_nopassphrase()
out1 = proto_types.TxOutputType(
address='12iyMbUb4R2K3gre4dHSrbu5azG5KaqVss',
amount=100000,
address='muevUcG1Bb8eM2nGUGhqmeujHRX7YXjSEu',
amount=40000000,
script_type=proto_types.PAYTOADDRESS
)
out2 = proto_types.TxOutputType(
address_n=[4],
amount=100000,
address_n=self.client.expand_path("45'/0/1/1"),
amount=44000000,
script_type=proto_types.PAYTOADDRESS
)
with self.client:
self.client.set_expected_responses(self._responses(self.inp1, self.inp2, change=2))
(_, serialized_tx) = self.client.sign_tx('Bitcoin', [self.inp1, self.inp2, ], [out1, out2, ])
(_, serialized_tx) = self.client.sign_tx('Testnet', [self.inp1, self.inp2, ], [out1, out2, ])
self.assertEqual(binascii.hexlify(serialized_tx), b'01000000023da7e83c25051d520133e56bfa86206352a285988e096bd14aaf5532a68ed0d100000000b5004830450221008f48ee3c6e69f8d2aeea9c482e3e80233fc83d78eb1ac7416362b25ae57d3eee02207f6b568f8f611efb17bd6bf8d0b32d334aa4110a2cc97a06f48aba4d045b7cd4014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653aeffffffff9643add957ab239b1d8fe387cc3807b48130a553a7b181e447ee9c089d82e2a600000000b40047304402206c5f93cbedc06ac1bae846d850a27c56b0e6f75ef247d3d67a10bbe8ea9da90302203d64f4803c0cbe5703268d58a80d54a3ad72cb1b856f19a6c6c999aad011a5b9014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c153aeffffffff02a0860100000000001976a91412e8391ad256dcdc023365978418d658dfecba1c88aca0860100000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000')
self.assertEqual(binascii.hexlify(serialized_tx), b'0100000002e53cf4e3fcd37f8c439286ce636476e1faeebf86bbb2f228a6b78d1b47c8c61601000000b400473044022064f13801744a6c21b694f62cdb5d834e852f13ecf85ed4d0a56ba279571c24e3022010fab4cb05bdd7b24c8376dda4f62a418548eea6eb483e58675fa06e0d5c642c014c69522103dc07026aacb5918dac4e09f9da8290d0ae22161699636c22cace78082116a7792103e70db185fad69c2971f0107a42930e5d82a9ed3a11b922a96fdfc4124b63e54c2103f3fe007a1e34ac76c1a2528e9149f90f9f93739929797afab6a8e18d682fa71053aeffffffff185315ae8050e18efa70d6ca96378a1194f57e2b102511f68b3a1414ee340cd800000000b4004730440220727b2522268f913acd213c507d7801b146e5b6cef666ad44b769c26d6c762e4d022021c0c2e9e8298dee2a490d956f7ab1b2d3160c1e37a50cc6d19a5e62eb484fc9014c6952210297ad8a5df42f9e362ef37d9a4ddced89d8f7a143690649aa0d0ff049c7daca842103ed1fd93989595d7ad4b488efd05a22c0239482c9a20923f2f214a38e54f6c41a2103f91460d79e4e463d7d90cb75254bcd62b515a99a950574c721efdc5f711dff3553aeffffffff02005a6202000000001976a9149b139230e4fe91c05a37ec334dc8378f3dbe377088ac00639f02000000001976a914b0d05a10926a7925508febdbab9a5bd4cda8c8f688ac00000000')
# first internal, second external
def test_internal_external(self):
self.setup_mnemonic_nopin_nopassphrase()
out1 = proto_types.TxOutputType(
address_n=[4],
amount=100000,
address_n=self.client.expand_path("45'/0/1/0"),
amount=40000000,
script_type=proto_types.PAYTOADDRESS
)
out2 = proto_types.TxOutputType(
address='17kTB7qSk3MupQxWdiv5ZU3zcrZc2Azes1',
amount=100000,
address='mwdrpMVSJxxsM8f8xbnCHn9ERaRT1NG1UX',
amount=44000000,
script_type=proto_types.PAYTOADDRESS
)
with self.client:
self.client.set_expected_responses(self._responses(self.inp1, self.inp2, change=1))
(_, serialized_tx) = self.client.sign_tx('Bitcoin', [self.inp1, self.inp2, ], [out1, out2, ])
(_, serialized_tx) = self.client.sign_tx('Testnet', [self.inp1, self.inp2, ], [out1, out2, ])
self.assertEqual(binascii.hexlify(serialized_tx), b'01000000023da7e83c25051d520133e56bfa86206352a285988e096bd14aaf5532a68ed0d100000000b4004730440220740f305af9cd10f290b0d5dd27968d3c08f313d58e70feb260e076bd57d427bd02202c0296b38e82993983b971196589a2c74cdc4931a2da88aa2c2bd89e58a3fdb2014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653aeffffffff9643add957ab239b1d8fe387cc3807b48130a553a7b181e447ee9c089d82e2a600000000b400473044022042f53a8cd53762fb95113d11f56f050dab9dead9a2026807c728d5c42ed62e9902202e708162a50ca16f5fac082c1a2a5350fcb74cbfce39968e76300a36457f45a7014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c153aeffffffff02a0860100000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088aca0860100000000001976a9144a087d89f8ad16ca029c675b037c02fd1c5f9aec88ac00000000')
self.assertEqual(binascii.hexlify(serialized_tx), b'0100000002e53cf4e3fcd37f8c439286ce636476e1faeebf86bbb2f228a6b78d1b47c8c61601000000b400473044022064f13801744a6c21b694f62cdb5d834e852f13ecf85ed4d0a56ba279571c24e3022010fab4cb05bdd7b24c8376dda4f62a418548eea6eb483e58675fa06e0d5c642c014c69522103dc07026aacb5918dac4e09f9da8290d0ae22161699636c22cace78082116a7792103e70db185fad69c2971f0107a42930e5d82a9ed3a11b922a96fdfc4124b63e54c2103f3fe007a1e34ac76c1a2528e9149f90f9f93739929797afab6a8e18d682fa71053aeffffffff185315ae8050e18efa70d6ca96378a1194f57e2b102511f68b3a1414ee340cd800000000b4004730440220727b2522268f913acd213c507d7801b146e5b6cef666ad44b769c26d6c762e4d022021c0c2e9e8298dee2a490d956f7ab1b2d3160c1e37a50cc6d19a5e62eb484fc9014c6952210297ad8a5df42f9e362ef37d9a4ddced89d8f7a143690649aa0d0ff049c7daca842103ed1fd93989595d7ad4b488efd05a22c0239482c9a20923f2f214a38e54f6c41a2103f91460d79e4e463d7d90cb75254bcd62b515a99a950574c721efdc5f711dff3553aeffffffff02005a6202000000001976a9149b139230e4fe91c05a37ec334dc8378f3dbe377088ac00639f02000000001976a914b0d05a10926a7925508febdbab9a5bd4cda8c8f688ac00000000')
# both outputs are external
def test_multisig_external_external(self):
self.setup_mnemonic_nopin_nopassphrase()
out1 = proto_types.TxOutputType(
address='3796Q9jVirg2KY1WQRqtmHKXCoSk8MB7Td',
amount=100000,
address='2N2aFoogGntQFFwdUVPfRmutXD22ThcNTsR',
amount=40000000,
script_type=proto_types.PAYTOADDRESS
)
out2 = proto_types.TxOutputType(
address='3CTPCg3ksh59jWt9zQpTPHCSQDCdJoQQ9d',
amount=100000,
address='2NFJjQcU8mw4Z3ywpbek8HL1VoJ27GDrkHw',
amount=44000000,
script_type=proto_types.PAYTOADDRESS
)
with self.client:
self.client.set_expected_responses(self._responses(self.inp1, self.inp2))
(_, serialized_tx) = self.client.sign_tx('Bitcoin', [self.inp1, self.inp2, ], [out1, out2, ])
(_, serialized_tx) = self.client.sign_tx('Testnet', [self.inp1, self.inp2, ], [out1, out2, ])
self.assertEqual(binascii.hexlify(serialized_tx), b'01000000023da7e83c25051d520133e56bfa86206352a285988e096bd14aaf5532a68ed0d100000000b500483045022100915e3761efb41895d40fa3bf8d3a68be7eb949e2411ec5655e231bbb334925ea02205814166b786a912f8f47315c9ede4955d2dfc70bb0b51230fccaaacf5a39a0ae014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653aeffffffff9643add957ab239b1d8fe387cc3807b48130a553a7b181e447ee9c089d82e2a600000000b400473044022018ca5516ee127eeeb8c70f10c267dd803b599688eade659e3b210bbf1712fffe02206c1adb35e672e67ee102dc232456ac5edc86f58f83d698995981e68d2a2a4294014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c153aeffffffff02a08601000000000017a9143bc72e27ec21644ace15b367ef7ba491f2507eb587a08601000000000017a9147615527d78854293edadf83682ea26937f8a51bb8700000000')
self.assertEqual(binascii.hexlify(serialized_tx), b'0100000002e53cf4e3fcd37f8c439286ce636476e1faeebf86bbb2f228a6b78d1b47c8c61601000000b400473044022059394e0dfcb2d2f4a6108703f801545ca5a820c0ac6a1859d0a3854813de55fa02207b6a57d70b82932ff58163336c461653a2dc82c78ed8157159e5178ac7325390014c69522103dc07026aacb5918dac4e09f9da8290d0ae22161699636c22cace78082116a7792103e70db185fad69c2971f0107a42930e5d82a9ed3a11b922a96fdfc4124b63e54c2103f3fe007a1e34ac76c1a2528e9149f90f9f93739929797afab6a8e18d682fa71053aeffffffff185315ae8050e18efa70d6ca96378a1194f57e2b102511f68b3a1414ee340cd800000000b40047304402205a911685f5b974b2fc4a19d5ce056218773a4d20b5eaae2c2f9594929308182002201e03449f5a8813ec19f408bf1b6f4f334886d6fcf9920e300fd7678ef0724f81014c6952210297ad8a5df42f9e362ef37d9a4ddced89d8f7a143690649aa0d0ff049c7daca842103ed1fd93989595d7ad4b488efd05a22c0239482c9a20923f2f214a38e54f6c41a2103f91460d79e4e463d7d90cb75254bcd62b515a99a950574c721efdc5f711dff3553aeffffffff02005a62020000000017a91466528dd543f94d162c8111d2ec248d25ba9b90948700639f020000000017a914f1fc92c0aed1712911c70a2e09ac15ff0922652f8700000000')
# inputs match, change matches (first is change)
def test_multisig_change_match_first(self):
@ -250,32 +258,32 @@ class TestMultisigChange(common.TrezorTest):
multisig_out1 = proto_types.MultisigRedeemScriptType(
pubkeys=[
proto_types.HDNodePathType(node=self.node_int, address_n=[1]),
proto_types.HDNodePathType(node=self.node_ext1, address_n=[1]),
proto_types.HDNodePathType(node=self.node_ext2, address_n=[1])
proto_types.HDNodePathType(node=self.node_ext2, address_n=[1, 0]),
proto_types.HDNodePathType(node=self.node_ext1, address_n=[1, 0]),
proto_types.HDNodePathType(node=self.node_int, address_n=[1, 0])
],
signatures=[b'', b'', b''],
m=2,
)
out1 = proto_types.TxOutputType(
address_n=[1],
address_n=[0x80000000 | 45, 0, 1, 0],
multisig=multisig_out1,
amount=100000,
amount=40000000,
script_type=proto_types.PAYTOMULTISIG
)
out2 = proto_types.TxOutputType(
address='3CTPCg3ksh59jWt9zQpTPHCSQDCdJoQQ9d',
amount=100000,
address='2NFJjQcU8mw4Z3ywpbek8HL1VoJ27GDrkHw',
amount=44000000,
script_type=proto_types.PAYTOADDRESS
)
with self.client:
self.client.set_expected_responses(self._responses(self.inp1, self.inp2, change=1))
(_, serialized_tx) = self.client.sign_tx('Bitcoin', [self.inp1, self.inp2, ], [out1, out2, ])
(_, serialized_tx) = self.client.sign_tx('Testnet', [self.inp1, self.inp2, ], [out1, out2, ])
self.assertEqual(binascii.hexlify(serialized_tx), b'01000000023da7e83c25051d520133e56bfa86206352a285988e096bd14aaf5532a68ed0d100000000b40047304402203cb26eac850f590951b12b513a5369c0b301c6d3ae1cd251aa837ce35427bdec0220289834c8c5cb837351ae06498d77fa6707611c09d628864a1f0a7e1d381bddd8014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653aeffffffff9643add957ab239b1d8fe387cc3807b48130a553a7b181e447ee9c089d82e2a600000000b40047304402207c2e39254d1e9cff42b523bcc0bf5ab66ae0c584deb2413759d9b269b1fe9e6f02205bc93a1884625b2359247c15a57e4e80b184b21a5f95e7f5ce846323236e30ac014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c153aeffffffff02a08601000000000017a914b69a5c6a63c01a09a90eb690031963f737cf96ed87a08601000000000017a9147615527d78854293edadf83682ea26937f8a51bb8700000000')
self.assertEqual(binascii.hexlify(serialized_tx), b'0100000002e53cf4e3fcd37f8c439286ce636476e1faeebf86bbb2f228a6b78d1b47c8c61601000000b400473044022059394e0dfcb2d2f4a6108703f801545ca5a820c0ac6a1859d0a3854813de55fa02207b6a57d70b82932ff58163336c461653a2dc82c78ed8157159e5178ac7325390014c69522103dc07026aacb5918dac4e09f9da8290d0ae22161699636c22cace78082116a7792103e70db185fad69c2971f0107a42930e5d82a9ed3a11b922a96fdfc4124b63e54c2103f3fe007a1e34ac76c1a2528e9149f90f9f93739929797afab6a8e18d682fa71053aeffffffff185315ae8050e18efa70d6ca96378a1194f57e2b102511f68b3a1414ee340cd800000000b40047304402205a911685f5b974b2fc4a19d5ce056218773a4d20b5eaae2c2f9594929308182002201e03449f5a8813ec19f408bf1b6f4f334886d6fcf9920e300fd7678ef0724f81014c6952210297ad8a5df42f9e362ef37d9a4ddced89d8f7a143690649aa0d0ff049c7daca842103ed1fd93989595d7ad4b488efd05a22c0239482c9a20923f2f214a38e54f6c41a2103f91460d79e4e463d7d90cb75254bcd62b515a99a950574c721efdc5f711dff3553aeffffffff02005a62020000000017a91466528dd543f94d162c8111d2ec248d25ba9b90948700639f020000000017a914f1fc92c0aed1712911c70a2e09ac15ff0922652f8700000000')
# inputs match, change matches (second is change)
def test_multisig_change_match_second(self):
@ -283,32 +291,32 @@ class TestMultisigChange(common.TrezorTest):
multisig_out2 = proto_types.MultisigRedeemScriptType(
pubkeys=[
proto_types.HDNodePathType(node=self.node_int, address_n=[2]),
proto_types.HDNodePathType(node=self.node_ext1, address_n=[2]),
proto_types.HDNodePathType(node=self.node_ext2, address_n=[2])
proto_types.HDNodePathType(node=self.node_ext1, address_n=[1, 1]),
proto_types.HDNodePathType(node=self.node_ext2, address_n=[1, 1]),
proto_types.HDNodePathType(node=self.node_int, address_n=[1, 1])
],
signatures=[b'', b'', b''],
m=2,
)
out1 = proto_types.TxOutputType(
address='37Wf955dcCaFSJmiNaGpacczMwj7iC8JMx',
amount=100000,
address='2N2aFoogGntQFFwdUVPfRmutXD22ThcNTsR',
amount=40000000,
script_type=proto_types.PAYTOADDRESS
)
out2 = proto_types.TxOutputType(
address_n=[2],
address_n=[0x80000000 | 45, 0, 1, 1],
multisig=multisig_out2,
amount=100000,
amount=44000000,
script_type=proto_types.PAYTOMULTISIG
)
with self.client:
self.client.set_expected_responses(self._responses(self.inp1, self.inp2, change=2))
(_, serialized_tx) = self.client.sign_tx('Bitcoin', [self.inp1, self.inp2, ], [out1, out2, ])
(_, serialized_tx) = self.client.sign_tx('Testnet', [self.inp1, self.inp2, ], [out1, out2, ])
self.assertEqual(binascii.hexlify(serialized_tx), b'01000000023da7e83c25051d520133e56bfa86206352a285988e096bd14aaf5532a68ed0d100000000b5004830450221008d5710ba7df3c32358a723c69458acc81a296646cad262217975ba00b24fdc6402201623a3e3778e6abad9025343cef6fad361a054463f928509324ee862a2e84e6a014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653aeffffffff9643add957ab239b1d8fe387cc3807b48130a553a7b181e447ee9c089d82e2a600000000b400473044022014d07e6a67c14a81d1042be2990d4c4ac29d9a46ba051168a9ccc09e987d97e202203cfe6714cff04421a90d5a4507f875515a1357fc2df306a44617ae7f88c7fcd1014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c153aeffffffff02a08601000000000017a9143fdb3ed6e85c87d77f263be3b0d0abc508fe4e3787a08601000000000017a914021809d0cb4a6fcf436e6b8cc743511b09d183218700000000')
self.assertEqual(binascii.hexlify(serialized_tx), b'0100000002e53cf4e3fcd37f8c439286ce636476e1faeebf86bbb2f228a6b78d1b47c8c61601000000b400473044022059394e0dfcb2d2f4a6108703f801545ca5a820c0ac6a1859d0a3854813de55fa02207b6a57d70b82932ff58163336c461653a2dc82c78ed8157159e5178ac7325390014c69522103dc07026aacb5918dac4e09f9da8290d0ae22161699636c22cace78082116a7792103e70db185fad69c2971f0107a42930e5d82a9ed3a11b922a96fdfc4124b63e54c2103f3fe007a1e34ac76c1a2528e9149f90f9f93739929797afab6a8e18d682fa71053aeffffffff185315ae8050e18efa70d6ca96378a1194f57e2b102511f68b3a1414ee340cd800000000b40047304402205a911685f5b974b2fc4a19d5ce056218773a4d20b5eaae2c2f9594929308182002201e03449f5a8813ec19f408bf1b6f4f334886d6fcf9920e300fd7678ef0724f81014c6952210297ad8a5df42f9e362ef37d9a4ddced89d8f7a143690649aa0d0ff049c7daca842103ed1fd93989595d7ad4b488efd05a22c0239482c9a20923f2f214a38e54f6c41a2103f91460d79e4e463d7d90cb75254bcd62b515a99a950574c721efdc5f711dff3553aeffffffff02005a62020000000017a91466528dd543f94d162c8111d2ec248d25ba9b90948700639f020000000017a914f1fc92c0aed1712911c70a2e09ac15ff0922652f8700000000')
# inputs match, change mismatches (second is change)
def test_multisig_mismatch_change(self):
@ -316,32 +324,32 @@ class TestMultisigChange(common.TrezorTest):
multisig_out2 = proto_types.MultisigRedeemScriptType(
pubkeys=[
proto_types.HDNodePathType(node=self.node_int, address_n=[2]),
proto_types.HDNodePathType(node=self.node_ext1, address_n=[2]),
proto_types.HDNodePathType(node=self.node_ext3, address_n=[2])
proto_types.HDNodePathType(node=self.node_ext1, address_n=[1, 0]),
proto_types.HDNodePathType(node=self.node_int, address_n=[1, 0]),
proto_types.HDNodePathType(node=self.node_ext3, address_n=[1, 0])
],
signatures=[b'', b'', b''],
m=2,
)
out1 = proto_types.TxOutputType(
address='3796Q9jVirg2KY1WQRqtmHKXCoSk8MB7Td',
amount=100000,
address='2N2aFoogGntQFFwdUVPfRmutXD22ThcNTsR',
amount=40000000,
script_type=proto_types.PAYTOADDRESS
)
out2 = proto_types.TxOutputType(
address_n=[2],
address_n=[0x80000000 | 45, 0, 1, 0],
multisig=multisig_out2,
amount=100000,
amount=44000000,
script_type=proto_types.PAYTOMULTISIG
)
with self.client:
self.client.set_expected_responses(self._responses(self.inp1, self.inp2))
(_, serialized_tx) = self.client.sign_tx('Bitcoin', [self.inp1, self.inp2, ], [out1, out2, ])
(_, serialized_tx) = self.client.sign_tx('Testnet', [self.inp1, self.inp2, ], [out1, out2, ])
self.assertEqual(binascii.hexlify(serialized_tx), b'01000000023da7e83c25051d520133e56bfa86206352a285988e096bd14aaf5532a68ed0d100000000b40047304402202a6238e8c9955a3d01609cbdaafcf47b0a53b2eabe2e28cf942fe9e253457eba02207f67afb4c35a8d28603e71a0696d0c123c0ca2370d78076c692ca3036c0a2c35014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653aeffffffff9643add957ab239b1d8fe387cc3807b48130a553a7b181e447ee9c089d82e2a600000000b40047304402200e87ee683b27f3995a2f8c9e9b4b17e24399d43a4c69ce5402105b6b93ac63cf0220201ba91db1f4ca2768f9277c115e95c2297bbe40969dcf9d10d0836a75c8ac9c014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c153aeffffffff02a08601000000000017a9143bc72e27ec21644ace15b367ef7ba491f2507eb587a08601000000000017a9143f22da0a6d4a4341be319e48e7b51b5a113fda208700000000')
self.assertEqual(binascii.hexlify(serialized_tx), b'0100000002e53cf4e3fcd37f8c439286ce636476e1faeebf86bbb2f228a6b78d1b47c8c61601000000b40047304402207f9992cc0230527faf54ec6bd233307db82bc8fac039dcee418bc6feb4e96a3a02206bb4cb157ad27c123277328a877572563a45d70b844d9ab07cc42238112f8c2a014c69522103dc07026aacb5918dac4e09f9da8290d0ae22161699636c22cace78082116a7792103e70db185fad69c2971f0107a42930e5d82a9ed3a11b922a96fdfc4124b63e54c2103f3fe007a1e34ac76c1a2528e9149f90f9f93739929797afab6a8e18d682fa71053aeffffffff185315ae8050e18efa70d6ca96378a1194f57e2b102511f68b3a1414ee340cd800000000b400473044022078a41bfa87d72d6ba810d84bf568b5a29acf8b851ba6c3a8dbff079b34a7feb0022037b770c776db0b6c883c38a684a121b90a59ed1958774cbf64de70e53e29639f014c6952210297ad8a5df42f9e362ef37d9a4ddced89d8f7a143690649aa0d0ff049c7daca842103ed1fd93989595d7ad4b488efd05a22c0239482c9a20923f2f214a38e54f6c41a2103f91460d79e4e463d7d90cb75254bcd62b515a99a950574c721efdc5f711dff3553aeffffffff02005a62020000000017a91466528dd543f94d162c8111d2ec248d25ba9b90948700639f020000000017a914e6a3e2fbadb7f559f8d20c46aceae78c96fcf1d18700000000')
# inputs mismatch, change matches with first input
def test_multisig_mismatch_inputs(self):
@ -349,29 +357,29 @@ class TestMultisigChange(common.TrezorTest):
multisig_out1 = proto_types.MultisigRedeemScriptType(
pubkeys=[
proto_types.HDNodePathType(node=self.node_ext1, address_n=[1]),
proto_types.HDNodePathType(node=self.node_ext2, address_n=[1]),
proto_types.HDNodePathType(node=self.node_int, address_n=[1])
proto_types.HDNodePathType(node=self.node_ext2, address_n=[1, 0]),
proto_types.HDNodePathType(node=self.node_ext1, address_n=[1, 0]),
proto_types.HDNodePathType(node=self.node_int, address_n=[1, 0])
],
signatures=[b'', b'', b''],
m=2,
)
out1 = proto_types.TxOutputType(
address_n=[1],
address_n=[0x80000000 | 45, 0, 1, 0],
multisig=multisig_out1,
amount=100000,
amount=40000000,
script_type=proto_types.PAYTOMULTISIG
)
out2 = proto_types.TxOutputType(
address='3CTPCg3ksh59jWt9zQpTPHCSQDCdJoQQ9d',
amount=100000,
address='2NFJjQcU8mw4Z3ywpbek8HL1VoJ27GDrkHw',
amount=65000000,
script_type=proto_types.PAYTOADDRESS
)
with self.client:
self.client.set_expected_responses(self._responses(self.inp1, self.inp3))
(_, serialized_tx) = self.client.sign_tx('Bitcoin', [self.inp1, self.inp3, ], [out1, out2, ])
(_, serialized_tx) = self.client.sign_tx('Testnet', [self.inp1, self.inp3, ], [out1, out2, ])
self.assertEqual(binascii.hexlify(serialized_tx), b'01000000023da7e83c25051d520133e56bfa86206352a285988e096bd14aaf5532a68ed0d100000000b40047304402204b7d6c7e9feef91209cbdf4deaf855696dc22a40e57bd3eafd5e00b0ee41d9de0220262c5a05d0b46ef98fddfef3831b3ebb6841ffbeb10666f8fb6f8d2e3023e30d014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653aeffffffffe39b254db8137202c7690cb0c6738f2e61661ce16f92b3f2087a00e5e51abce401000000b500483045022100bb2118da21c8a84f115b655f640f269a40be77ae2c0af9c5ffd8260a85dbfc7702202e7b5b6c05b8f50bd879dbee88828e80e85448d686b63a1a50e99d921923f6f5014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e2102e0c21e2a7cf00b94c5421725acff97f9826598b91f2340c5ddda730caca7d648210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653aeffffffff02a08601000000000017a914a4efc33d43d7a8a0040182c76ab624ff862f50d287a08601000000000017a9147615527d78854293edadf83682ea26937f8a51bb8700000000')
self.assertEqual(binascii.hexlify(serialized_tx), b'0100000002e53cf4e3fcd37f8c439286ce636476e1faeebf86bbb2f228a6b78d1b47c8c61601000000b500483045022100d907b9339951c96ef4515ef7aff8b3c28c4c8c5875d7421aa1de9f3a94e3508302205cdc311a6c91dfbb74f1a9a940a994a65dbfb0cf6dedcaaaeee839e0b8fd016d014c69522103dc07026aacb5918dac4e09f9da8290d0ae22161699636c22cace78082116a7792103e70db185fad69c2971f0107a42930e5d82a9ed3a11b922a96fdfc4124b63e54c2103f3fe007a1e34ac76c1a2528e9149f90f9f93739929797afab6a8e18d682fa71053aeffffffff39f756d82082b580b0d69ae8798ff10a981820ccfe1ab149a708a37bc26d94b000000000b500483045022100fdad4a47d15f47cc364fe0cbed11b1ced1f9ef210bc1bd413ec4384f630c63720220752e4f09ea4e5e6623f5ebe89b3983ec6e5702f63f9bce696f10b2d594d23532014c6952210297ad8a5df42f9e362ef37d9a4ddced89d8f7a143690649aa0d0ff049c7daca842103b6321a1194e5cc47b6b7edc3f67a096e6f71ccb72440f84f390b6e98df0ea8ec2103f91460d79e4e463d7d90cb75254bcd62b515a99a950574c721efdc5f711dff3553aeffffffff02005a62020000000017a91466528dd543f94d162c8111d2ec248d25ba9b90948740d2df030000000017a914f1fc92c0aed1712911c70a2e09ac15ff0922652f8700000000')

View File

@ -0,0 +1 @@
{"txid": "16c6c8471b8db7a628f2b2bb86bfeefae1766463ce8692438c7fd3fce3f43ce5", "version": 1, "locktime": 0, "vin": [{"txid": "3143f555a21753fbf3f095e27823122c4107393bb388aca736bd613e91192be4", "vout": 1, "sequence": 4294967295, "n": 0, "scriptSig": {"hex": "483045022100a2d3237b16795b10b33c19651261f9b9d1f8a0143f87f749adcc84e3d0b8f38702205ab3f80431af41091a01c946586b68fc843c8341738656cea70e25b0d0be2c970121024e6f7ddfe8c050649c7d3291f07e188c3fe779fb71954f8d00eaf1eff9af958e", "asm": "3045022100a2d3237b16795b10b33c19651261f9b9d1f8a0143f87f749adcc84e3d0b8f38702205ab3f80431af41091a01c946586b68fc843c8341738656cea70e25b0d0be2c97[ALL] 024e6f7ddfe8c050649c7d3291f07e188c3fe779fb71954f8d00eaf1eff9af958e"}, "addr": "mso9GMbZncQ767FQhkuMK8n4L4uQxDTFAA", "valueSat": 277569531, "value": 2.77569531, "doubleSpentTxID": null}], "vout": [{"value": "2.27568531", "n": 0, "scriptPubKey": {"hex": "76a9140889daec397047b8c6cce0080ba6c5455b443a8188ac", "asm": "OP_DUP OP_HASH160 0889daec397047b8c6cce0080ba6c5455b443a81 OP_EQUALVERIFY OP_CHECKSIG", "addresses": ["mgJ6qw6qhWex1ePkbnaeTcSad7jca3Dpss"], "type": "pubkeyhash"}, "spentTxId": "d80c34ee14143a8bf61125102b7ef594118a3796cad670fa8ee15080ae155318", "spentIndex": 0, "spentHeight": 1230562}, {"value": "0.50000000", "n": 1, "scriptPubKey": {"hex": "a914b250bcb267cf4e65a6e4614a5e344720a025286987", "asm": "OP_HASH160 b250bcb267cf4e65a6e4614a5e344720a0252869 OP_EQUAL", "addresses": ["2N9W4z9AhAPaHghtqVQPbaTAGHdbrhKeBQw"], "type": "scripthash"}, "spentTxId": null, "spentIndex": null, "spentHeight": null}], "blockhash": "0000000000003b8b58d63833112246c0f60a78ced6a0cffb1aa77338a75beb21", "blockheight": 1230561, "confirmations": 294, "time": 1510832886, "blocktime": 1510832886, "valueOut": 2.77568531, "size": 224, "valueIn": 2.77569531, "fees": 1e-05}

View File

@ -0,0 +1 @@
{"txid": "b0946dc27ba308a749b11afecc2018980af18f79e89ad6b080b58220d856f739", "version": 1, "locktime": 0, "vin": [{"txid": "d80c34ee14143a8bf61125102b7ef594118a3796cad670fa8ee15080ae155318", "vout": 1, "sequence": 4294967295, "n": 0, "scriptSig": {"hex": "473044022004b4045313f2b9f20c3d0d7e042c1caf3ee7af0531a4a4359c1f950f9b7780e602205abf837a2fdefd3ee708f052e740e763702bb40e976cab4e243035d4d77cb3b401210228fa17826fb9632c6e36ee31b32aebf20a81ee921b3d1c627a94b4b3dba879dd", "asm": "3044022004b4045313f2b9f20c3d0d7e042c1caf3ee7af0531a4a4359c1f950f9b7780e602205abf837a2fdefd3ee708f052e740e763702bb40e976cab4e243035d4d77cb3b4[ALL] 0228fa17826fb9632c6e36ee31b32aebf20a81ee921b3d1c627a94b4b3dba879dd"}, "addr": "mhu28zovdephvsYqdWicfYnCccTHwC3yfd", "valueSat": 193067531, "value": 1.93067531, "doubleSpentTxID": null}], "vout": [{"value": "0.55500000", "n": 0, "scriptPubKey": {"hex": "a9142880f749ea56a74031c2b222cf88937da6f58a3787", "asm": "OP_HASH160 2880f749ea56a74031c2b222cf88937da6f58a37 OP_EQUAL", "addresses": ["2MvwPWfp2XPU3S1cMwgEMKBPUw38VP5SBE4"], "type": "scripthash"}, "spentTxId": null, "spentIndex": null, "spentHeight": null}, {"value": "1.37566531", "n": 1, "scriptPubKey": {"hex": "76a9146311e2d6a2180ec64969f4ca11ec4ca8dd38fcf188ac", "asm": "OP_DUP OP_HASH160 6311e2d6a2180ec64969f4ca11ec4ca8dd38fcf1 OP_EQUALVERIFY OP_CHECKSIG", "addresses": ["mpYncnupsCWcBoP53K29WZ3yxGvyK2wuFs"], "type": "pubkeyhash"}, "spentTxId": null, "spentIndex": null, "spentHeight": null}], "blockhash": "000000002f8d08a201d8345f9d65f7ca64c1a6af50c3c2dd9bca71c45efdb089", "blockheight": 1230566, "confirmations": 289, "time": 1510834391, "blocktime": 1510834391, "valueOut": 1.93066531, "size": 223, "valueIn": 1.93067531, "fees": 1e-05}

View File

@ -0,0 +1 @@
{"txid": "d80c34ee14143a8bf61125102b7ef594118a3796cad670fa8ee15080ae155318", "version": 1, "locktime": 0, "vin": [{"txid": "16c6c8471b8db7a628f2b2bb86bfeefae1766463ce8692438c7fd3fce3f43ce5", "vout": 0, "sequence": 4294967295, "n": 0, "scriptSig": {"hex": "483045022100ea03d520495cd50b22b9c209f428de32aca2116c06e0fd391cf0a516a0974fff02207424a0742166fb4da9676fbfd09c8b5e7f73bdca72cd1088eb6037863448003d012102fbc883b74248b0207b22d42f591ba562db991494428adaaeb7c819ed3ac0cea9", "asm": "3045022100ea03d520495cd50b22b9c209f428de32aca2116c06e0fd391cf0a516a0974fff02207424a0742166fb4da9676fbfd09c8b5e7f73bdca72cd1088eb6037863448003d[ALL] 02fbc883b74248b0207b22d42f591ba562db991494428adaaeb7c819ed3ac0cea9"}, "addr": "mgJ6qw6qhWex1ePkbnaeTcSad7jca3Dpss", "valueSat": 227568531, "value": 2.27568531, "doubleSpentTxID": null}], "vout": [{"value": "0.34500000", "n": 0, "scriptPubKey": {"hex": "a914daa29c05a2af12752e459dedaee1d78e459c379c87", "asm": "OP_HASH160 daa29c05a2af12752e459dedaee1d78e459c379c OP_EQUAL", "addresses": ["2NDBG6QXQLtnQ3jRGkrqo53BiCeXfQXLdj4"], "type": "scripthash"}, "spentTxId": null, "spentIndex": null, "spentHeight": null}, {"value": "1.93067531", "n": 1, "scriptPubKey": {"hex": "76a9141a1c9c85a4b98f1799aae582df6c911bef2478f488ac", "asm": "OP_DUP OP_HASH160 1a1c9c85a4b98f1799aae582df6c911bef2478f4 OP_EQUALVERIFY OP_CHECKSIG", "addresses": ["mhu28zovdephvsYqdWicfYnCccTHwC3yfd"], "type": "pubkeyhash"}, "spentTxId": "b0946dc27ba308a749b11afecc2018980af18f79e89ad6b080b58220d856f739", "spentIndex": 0, "spentHeight": 1230566}], "blockhash": "0000000000002c2f3a07b4ab0e2467319b53e805706d293e308c0ad3cc0c593b", "blockheight": 1230562, "confirmations": 293, "time": 1510832943, "blocktime": 1510832943, "valueOut": 2.27567531, "size": 224, "valueIn": 2.27568531, "fees": 1e-05}