From e9b540e6b6e321b474c485f0325bbdf01b14a92f Mon Sep 17 00:00:00 2001 From: Tibor Arpas Date: Wed, 24 Oct 2018 15:05:59 +0200 Subject: [PATCH] altcoin: Capricoin support tests and minor trezorctl addition. (#325) --- trezorctl | 5 +- trezorlib/btc.py | 4 + .../device_tests/test_msg_signtx_capricoin.py | 75 +++++++++++++++++++ ...7d162c17c60b15d6c0ac23be5e31369e7235f.json | 45 +++++++++++ ...8e056f8f9ecf8996d3f428e75a6f23f2c5e8c.json | 45 +++++++++++ trezorlib/tx_api.py | 3 + 6 files changed, 176 insertions(+), 1 deletion(-) create mode 100644 trezorlib/tests/device_tests/test_msg_signtx_capricoin.py create mode 100644 trezorlib/tests/txcache/insight_capricoin_tx_3bf506c81ce84eda891679ddc797d162c17c60b15d6c0ac23be5e31369e7235f.json create mode 100644 trezorlib/tests/txcache/insight_capricoin_tx_f3a6e6411f1b2dffd76d2729bae8e056f8f9ecf8996d3f428e75a6f23f2c5e8c.json diff --git a/trezorctl b/trezorctl index 78c5f52445..e4addc168e 100755 --- a/trezorctl +++ b/trezorctl @@ -879,9 +879,12 @@ def sign_tx(connect, coin): tx_version = click.prompt("Transaction version", type=int, default=2) tx_locktime = click.prompt("Transaction locktime", type=int, default=0) + tx_timestamp = click.prompt( + "Transaction timestamp (Capricoin)", type=int, default=None + ) _, serialized_tx = btc.sign_tx( - client, coin, inputs, outputs, tx_version, tx_locktime + client, coin, inputs, outputs, tx_version, tx_locktime, timestamp=tx_timestamp ) client.close() diff --git a/trezorlib/btc.py b/trezorlib/btc.py index 250a04b223..695b9202d3 100644 --- a/trezorlib/btc.py +++ b/trezorlib/btc.py @@ -92,6 +92,7 @@ def sign_tx( overwintered=None, version_group_id=None, debug_processor=None, + timestamp=None, ): # start = time.time() txes = client._prepare_sign_tx(inputs, outputs) @@ -111,6 +112,8 @@ def sign_tx( tx.overwintered = overwintered if version_group_id is not None: tx.version_group_id = version_group_id + if timestamp is not None: + tx.timestamp = timestamp res = client.call(tx) # Prepare structure for signatures @@ -155,6 +158,7 @@ def sign_tx( msg.version = current_tx.version msg.lock_time = current_tx.lock_time msg.inputs_cnt = len(current_tx.inputs) + msg.timestamp = current_tx.timestamp if res.details.tx_hash: msg.outputs_cnt = len(current_tx.bin_outputs) else: diff --git a/trezorlib/tests/device_tests/test_msg_signtx_capricoin.py b/trezorlib/tests/device_tests/test_msg_signtx_capricoin.py new file mode 100644 index 0000000000..28ae36cfe6 --- /dev/null +++ b/trezorlib/tests/device_tests/test_msg_signtx_capricoin.py @@ -0,0 +1,75 @@ +# This file is part of the Trezor project. +# +# Copyright (C) 2012-2018 SatoshiLabs and contributors +# +# This library is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the License along with this library. +# If not, see . + +import pytest + +from trezorlib import btc, coins, messages as proto +from trezorlib.tools import parse_path + +from .common import TrezorTest + +TXHASH_3bf506 = bytes.fromhex( + "3bf506c81ce84eda891679ddc797d162c17c60b15d6c0ac23be5e31369e7235f" +) + +TXHASH_f3a6e6 = bytes.fromhex( + "f3a6e6411f1b2dffd76d2729bae8e056f8f9ecf8996d3f428e75a6f23f2c5e8c" +) + + +@pytest.mark.xfail +@pytest.mark.capricoin +class TestMsgSigntx(TrezorTest): + def test_timestamp_included(self): + self.setup_mnemonic_allallall() + self.client.set_tx_api(coins.tx_api["Capricoin"]) + + # tx: 3bf506c81ce84eda891679ddc797d162c17c60b15d6c0ac23be5e31369e7235f + # input 0: 0.01 CPC + # tx: f3a6e6411f1b2dffd76d2729bae8e056f8f9ecf8996d3f428e75a6f23f2c5e8c + # input 0: 0.02 CPC + + inp1 = proto.TxInputType( + address_n=parse_path("m/44'/289'/0'/0/0"), + prev_hash=TXHASH_3bf506, + prev_index=0, + ) + + inp2 = proto.TxInputType( + address_n=parse_path("m/44'/289'/0'/0/0"), + prev_hash=TXHASH_f3a6e6, + prev_index=1, + ) + + out1 = proto.TxOutputType( + address="CUGi8RGPWxbHM6FxF4eMEfqmQ6Bs5VjCdr", + amount=3000000 - 20000, + script_type=proto.OutputScriptType.PAYTOADDRESS, + ) + + with self.client: + timestamp_signatures, timestamp_tx = btc.sign_tx( + self.client, + "Capricoin", + [inp1, inp2], + [out1], + version=1, + timestamp=0x5BCF5C66, + ) + + # Accepted by network https://insight.capricoin.org/tx/1bf227e6e24fe1f8ac98849fe06a2c5b77762e906fcf7e82787675f7f3a10bb8 + accepted_txhex = "01000000665ccf5b025f23e76913e3e53bc20a6c5db1607cc162d197c7dd791689da4ee81cc806f53b000000006b483045022100fce7ccbeb9524f36d118ebcfebcb133a05c236c4478e2051cfd5c9632920aee602206921b7be1a81f30cce3d8e7dba4597fc16a2761c42321c49d65eeacdfe3781250121021fcf98aee04939ec7df5762f426dc2d1db8026e3a73c3bbe44749dacfbb61230ffffffff8c5e2c3ff2a6758e423f6d99f8ecf9f856e0e8ba29276dd7ff2d1b1f41e6a6f3010000006a473044022015d967166fe9f89fbed8747328b1c4658aa1d7163e731c5fd5908feafe08e9a6022028af30801098418bd298cc60b143c52c48466f5791256721304b6eba4fdf0b3c0121021fcf98aee04939ec7df5762f426dc2d1db8026e3a73c3bbe44749dacfbb61230ffffffff01a0782d00000000001976a914818437acfd15780debd31f3fd21d4ca678bb36d188ac00000000" + assert timestamp_tx.hex() == accepted_txhex diff --git a/trezorlib/tests/txcache/insight_capricoin_tx_3bf506c81ce84eda891679ddc797d162c17c60b15d6c0ac23be5e31369e7235f.json b/trezorlib/tests/txcache/insight_capricoin_tx_3bf506c81ce84eda891679ddc797d162c17c60b15d6c0ac23be5e31369e7235f.json new file mode 100644 index 0000000000..20efe0776c --- /dev/null +++ b/trezorlib/tests/txcache/insight_capricoin_tx_3bf506c81ce84eda891679ddc797d162c17c60b15d6c0ac23be5e31369e7235f.json @@ -0,0 +1,45 @@ +{ + "txid" : "3bf506c81ce84eda891679ddc797d162c17c60b15d6c0ac23be5e31369e7235f", + "version" : 1, + "time" : 1540315430, + "locktime" : 0, + "vin" : [ + { + "txid" : "915340ecc7466d287596f1f5b1fa0c1fa78c5b76ede0dff978fd6a1ca31eee24", + "vout" : 0, + "scriptSig" : { + "asm" : "3045022100c48a9689e2fc28c354d567390c15b94b86923f3c94b7674a69c20113cc83d16102202d0b12d451a4c28fd6c092bb46bf64e242a0c5898420e59c8d7799261ae449a901 03b3a1b0304d81f5a8366281c9a5516d8b3f1cfe6a720f3bf7a222e3a46a87f2c3", + "hex" : "483045022100c48a9689e2fc28c354d567390c15b94b86923f3c94b7674a69c20113cc83d16102202d0b12d451a4c28fd6c092bb46bf64e242a0c5898420e59c8d7799261ae449a9012103b3a1b0304d81f5a8366281c9a5516d8b3f1cfe6a720f3bf7a222e3a46a87f2c3" + }, + "sequence" : 4294967295 + } + ], + "vout" : [ + { + "value" : 0.01000000, + "n" : 0, + "scriptPubKey" : { + "asm" : "OP_DUP OP_HASH160 369df3cc0eb7acd7f0e0491a225a2ddad5ce3d4a OP_EQUALVERIFY OP_CHECKSIG", + "hex" : "76a914369df3cc0eb7acd7f0e0491a225a2ddad5ce3d4a88ac", + "reqSigs" : 1, + "type" : "pubkeyhash", + "addresses" : [ + "CMSgH7wq4kV9ogmSPB5rBmPceQJy3oA9Bu" + ] + } + }, + { + "value" : 0.49452200, + "n" : 1, + "scriptPubKey" : { + "asm" : "OP_DUP OP_HASH160 52546e612e890e3028ee4b3d8b6333bb6912bfae OP_EQUALVERIFY OP_CHECKSIG", + "hex" : "76a91452546e612e890e3028ee4b3d8b6333bb6912bfae88ac", + "reqSigs" : 1, + "type" : "pubkeyhash", + "addresses" : [ + "CPyD89mKLJEi5NESHfxbAYZGe8F9x61YNk" + ] + } + } + ] +} diff --git a/trezorlib/tests/txcache/insight_capricoin_tx_f3a6e6411f1b2dffd76d2729bae8e056f8f9ecf8996d3f428e75a6f23f2c5e8c.json b/trezorlib/tests/txcache/insight_capricoin_tx_f3a6e6411f1b2dffd76d2729bae8e056f8f9ecf8996d3f428e75a6f23f2c5e8c.json new file mode 100644 index 0000000000..5e336aa1ec --- /dev/null +++ b/trezorlib/tests/txcache/insight_capricoin_tx_f3a6e6411f1b2dffd76d2729bae8e056f8f9ecf8996d3f428e75a6f23f2c5e8c.json @@ -0,0 +1,45 @@ +{ + "txid" : "f3a6e6411f1b2dffd76d2729bae8e056f8f9ecf8996d3f428e75a6f23f2c5e8c", + "version" : 1, + "time" : 1540315682, + "locktime" : 0, + "vin" : [ + { + "txid" : "3bf506c81ce84eda891679ddc797d162c17c60b15d6c0ac23be5e31369e7235f", + "vout" : 1, + "scriptSig" : { + "asm" : "3044022064cc095beb149568f08d4f0b42fea2c41d5864a7c71e5770467c6e07dc03bc5702201ff7f2654ad7a09efca5483b7a7584fffccda9f79b6e9cdb77e407e66e07f71e01 03e8d2aee7293fa37e85692b9f41d2fda52787f10cbe486642a0a7543cc478160b", + "hex" : "473044022064cc095beb149568f08d4f0b42fea2c41d5864a7c71e5770467c6e07dc03bc5702201ff7f2654ad7a09efca5483b7a7584fffccda9f79b6e9cdb77e407e66e07f71e012103e8d2aee7293fa37e85692b9f41d2fda52787f10cbe486642a0a7543cc478160b" + }, + "sequence" : 4294967295 + } + ], + "vout" : [ + { + "value" : 0.47440250, + "n" : 0, + "scriptPubKey" : { + "asm" : "OP_DUP OP_HASH160 83259afffb250f9dee12cd0240956ae5e0f351e0 OP_EQUALVERIFY OP_CHECKSIG", + "hex" : "76a91483259afffb250f9dee12cd0240956ae5e0f351e088ac", + "reqSigs" : 1, + "type" : "pubkeyhash", + "addresses" : [ + "CURL93YyedCm2qwfJ1Jtsk8JnrQHavVehe" + ] + } + }, + { + "value" : 0.02000000, + "n" : 1, + "scriptPubKey" : { + "asm" : "OP_DUP OP_HASH160 369df3cc0eb7acd7f0e0491a225a2ddad5ce3d4a OP_EQUALVERIFY OP_CHECKSIG", + "hex" : "76a914369df3cc0eb7acd7f0e0491a225a2ddad5ce3d4a88ac", + "reqSigs" : 1, + "type" : "pubkeyhash", + "addresses" : [ + "CMSgH7wq4kV9ogmSPB5rBmPceQJy3oA9Bu" + ] + } + } + ] +} \ No newline at end of file diff --git a/trezorlib/tx_api.py b/trezorlib/tx_api.py index e126fd84bd..87b558998d 100644 --- a/trezorlib/tx_api.py +++ b/trezorlib/tx_api.py @@ -94,6 +94,9 @@ class TxApiInsight(TxApi): t.version = data["version"] t.lock_time = data.get("locktime") + if self.network == "insight_capricoin": + t.timestamp = data["time"] + if self.decred: t.expiry = data["expiry"]