python: completely drop trezorlib.coins and trezorlib.tx_api

pull/919/head
matejcik 4 years ago
parent 5a526888cf
commit 325dae890e

@ -21,6 +21,8 @@ _At the moment, the project does **not** adhere to [Semantic Versioning](https:/
### Changed ### Changed
- `trezorlib.tx_api.json_to_tx` was reduced to only support Bitcoin fields, and moved
to `trezorlib.btc.from_json`.
- API for `cosi` module was streamlined: `verify_m_of_n` is now `verify`, the old - API for `cosi` module was streamlined: `verify_m_of_n` is now `verify`, the old
`verify` is `verify_combined` `verify` is `verify_combined`
- internals of firmware parsing were reworked to support signing firmware headers - internals of firmware parsing were reworked to support signing firmware headers
@ -34,8 +36,10 @@ _At the moment, the project does **not** adhere to [Semantic Versioning](https:/
### Removed ### Removed
- `trezorlib.tx_api` was removed
- `trezorlib.coins` and coin data was removed
- `btc.sign_tx` will not preload transaction data from `prev_txes`, as usage with TxApi - `btc.sign_tx` will not preload transaction data from `prev_txes`, as usage with TxApi
is being phased out is being removed
- PIN protection and passphrase protection for `ping()` command was removed - PIN protection and passphrase protection for `ping()` command was removed
## [0.11.6] - 2019-12-30 ## [0.11.6] - 2019-12-30

@ -14,10 +14,6 @@ The full list of subcommands can be seen like so:
Each subcommand has its own help, shown with ``trezorctl <command> --help``. Each subcommand has its own help, shown with ``trezorctl <command> --help``.
In addition, aliases are available for currency ticker symbols. For example, instead
of ``trezorctl btc sign-message``, it is possible to use ``trezorctl ltc sign-message``.
In that case, the ``-c`` option of ``sign-message`` can be omitted.
List of subcommands List of subcommands
------------------- -------------------

@ -23,7 +23,7 @@ import time
import click import click
from .. import coins, log, messages, protobuf, ui from .. import log, messages, protobuf, ui
from ..client import TrezorClient from ..client import TrezorClient
from ..transport import enumerate_devices, get_transport from ..transport import enumerate_devices, get_transport
from ..transport.udp import UdpTransport from ..transport.udp import UdpTransport
@ -116,12 +116,6 @@ class TrezorctlGroup(click.Group):
except Exception: except Exception:
pass pass
# try to find a bitcoin-like coin whose shortcut matches the command
for coin in coins.coins_list:
if cmd_name.lower() == coin["shortcut"].lower():
btc.DEFAULT_COIN = coin["coin_name"]
return btc.cli
return None return None

@ -1,39 +0,0 @@
# This file is part of the Trezor project.
#
# Copyright (C) 2012-2019 SatoshiLabs and contributors
#
# This library is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License version 3
# as published by the Free Software Foundation.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the License along with this library.
# If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
import json
import os.path
COINS_JSON = os.path.join(os.path.dirname(__file__), "coins.json")
def _load_coins_json():
# Load coins.json to local variables
# NOTE: coins.json is generated via `make coins_json` command.
with open(COINS_JSON) as coins_json:
return json.load(coins_json)
# exported variables
__all__ = ["by_name", "slip44"]
try:
coins_list = _load_coins_json()
by_name = {coin["coin_name"]: coin for coin in coins_list}
except Exception as e:
raise ImportError("Failed to load coins.json. Check your installation.") from e
slip44 = {name: coin["slip44"] for name, coin in by_name.items()}

@ -21,7 +21,6 @@ import struct
import unicodedata import unicodedata
from typing import List, NewType from typing import List, NewType
from .coins import slip44
from .exceptions import TrezorFailure from .exceptions import TrezorFailure
CallException = TrezorFailure CallException = TrezorFailure
@ -168,11 +167,6 @@ def parse_path(nstr: str) -> Address:
if n[0] == "m": if n[0] == "m":
n = n[1:] n = n[1:]
# coin_name/a/b/c => 44'/SLIP44_constant'/a/b/c
if n[0] in slip44:
coin_id = slip44[n[0]]
n[0:1] = ["44h", "{}h".format(coin_id)]
def str_to_harden(x: str) -> int: def str_to_harden(x: str) -> int:
if x.startswith("-"): if x.startswith("-"):
return H_(abs(int(x))) return H_(abs(int(x)))
@ -183,8 +177,8 @@ def parse_path(nstr: str) -> Address:
try: try:
return [str_to_harden(x) for x in n] return [str_to_harden(x) for x in n]
except Exception: except Exception as e:
raise ValueError("Invalid BIP32 path", nstr) raise ValueError("Invalid BIP32 path", nstr) from e
def normalize_nfc(txt): def normalize_nfc(txt):

@ -1,53 +0,0 @@
# This file is part of the Trezor project.
#
# Copyright (C) 2012-2019 SatoshiLabs and contributors
#
# This library is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License version 3
# as published by the Free Software Foundation.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the License along with this library.
# If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
from decimal import Decimal
from . import messages
def _json_to_input(vin):
i = messages.TxInputType()
if "coinbase" in vin:
i.prev_hash = b"\0" * 32
i.prev_index = 0xFFFFFFFF # signed int -1
i.script_sig = bytes.fromhex(vin["coinbase"])
i.sequence = vin["sequence"]
else:
i.prev_hash = bytes.fromhex(vin["txid"])
i.prev_index = vin["vout"]
i.script_sig = bytes.fromhex(vin["scriptSig"]["hex"])
i.sequence = vin["sequence"]
return i
def _json_to_bin_output(vout):
o = messages.TxOutputBinType()
o.amount = int(Decimal(vout["value"]) * (10 ** 8))
o.script_pubkey = bytes.fromhex(vout["scriptPubKey"]["hex"])
return o
def json_to_tx(data):
t = messages.TransactionType()
t.version = data["version"]
t.lock_time = data.get("locktime")
t.inputs = [_json_to_input(vin) for vin in data["vin"]]
t.bin_outputs = [_json_to_bin_output(vout) for vout in data["vout"]]
return t

@ -1,103 +0,0 @@
# This file is part of the Trezor project.
#
# Copyright (C) 2012-2019 SatoshiLabs and contributors
#
# This library is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License version 3
# as published by the Free Software Foundation.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the License along with this library.
# If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
import decimal
import json
import os
from trezorlib import coins, tx_api
CACHE_PATH = os.path.join(os.path.dirname(__file__), "../../tests/txcache")
TxApiBitcoin = coins.tx_api["Bitcoin"]
TxApiZencash = coins.tx_api["Horizen"]
def load_tx_json(coin_name, txhash):
filename = "insight_{}_tx_{}.json".format(coin_name, txhash)
with open(os.path.join(CACHE_PATH, filename)) as f:
return json.load(f, parse_float=decimal.Decimal)
def test_tx_api_gettx():
TxApiBitcoin.get_tx(
"39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5"
)
TxApiBitcoin.get_tx(
"54aa5680dea781f45ebb536e53dffc526d68c0eb5c00547e323b2c32382dfba3"
)
TxApiBitcoin.get_tx(
"58497a7757224d1ff1941488d23087071103e5bf855f4c1c44e5c8d9d82ca46e"
)
TxApiBitcoin.get_tx(
"6189e3febb5a21cee8b725aa1ef04ffce7e609448446d3a8d6f483c634ef5315"
)
TxApiBitcoin.get_tx(
"a6e2829d089cee47e481b1a753a53081b40738cc87e38f1d9b23ab57d9ad4396"
)
TxApiBitcoin.get_tx(
"c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"
)
TxApiBitcoin.get_tx(
"c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb"
)
TxApiBitcoin.get_tx(
"c6be22d34946593bcad1d2b013e12f74159e69574ffea21581dad115572e031c"
)
TxApiBitcoin.get_tx(
"d1d08ea63255af4ad16b098e9885a252632086fa6be53301521d05253ce8a73d"
)
TxApiBitcoin.get_tx(
"d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"
)
TxApiBitcoin.get_tx(
"e4bc1ae5e5007a08f2b3926fe11c66612e8f73c6b00c69c7027213b84d259be3"
)
def test_tx_api_current_block():
height = TxApiZencash.current_height()
assert height > 347041
def test_tx_api_get_block_hash():
hash = TxApiZencash.get_block_hash(110000)
assert (
hash.hex() == "000000003f5d6ba1385c6cd2d4f836dfc5adf7f98834309ad67e26faef462454"
)
def test_tx_api_dash_dip2():
dash_data = coins.by_name["Dash"]
def get_tx(txhash):
data = load_tx_json("dash", txhash)
return tx_api.json_to_tx(dash_data, data)
# Test if pre-DIP2 TXs are still working as expected
tx = get_tx("acb3b7f259429989fc9c51ae4a5e3e3eab0723dceb21577533ac7c4b4ba4db5d")
assert tx.version == 2 # pre-DIP2
assert tx.extra_data is None and tx.extra_data_len is None
# Test if version 3 TX with type=0 is treated as normal TX
tx = get_tx("5579eaa64b2a0233e7d8d037f5a5afc957cedf48f1c4067e9e33ca6df22ab04f")
assert tx.version == 3
assert tx.extra_data is None and tx.extra_data_len is None
# Test if DIP2 payloads are initialized correctly
tx = get_tx("15575a1c874bd60a819884e116c42e6791c8283ce1fc3b79f0d18531a61bbb8a")
assert tx.version == (3 | (5 << 16)) # DIP2 type 1 (ProRegTx)
assert len(tx.extra_data) == (38 + 1) # real length + varint size

@ -39,9 +39,8 @@ class TestMsgSigntxZcash:
# input 1: 3.0 TAZ # input 1: 3.0 TAZ
inp1 = proto.TxInputType( inp1 = proto.TxInputType(
address_n=parse_path( # tmQoJ3PTXgQLaRRZZYT6xk8XtjRbr2kCqwu
"m/Zcash Testnet/0h/0/0" address_n=parse_path("m/44h/1h/0h/0/0"),
), # tmQoJ3PTXgQLaRRZZYT6xk8XtjRbr2kCqwu
amount=300000000, amount=300000000,
prev_hash=TXHASH_aaf51e, prev_hash=TXHASH_aaf51e,
prev_index=1, prev_index=1,
@ -104,9 +103,8 @@ class TestMsgSigntxZcash:
# input 1: 3.0 TAZ # input 1: 3.0 TAZ
inp1 = proto.TxInputType( inp1 = proto.TxInputType(
address_n=parse_path( # tmQoJ3PTXgQLaRRZZYT6xk8XtjRbr2kCqwu
"m/Zcash Testnet/0h/0/0" address_n=parse_path("m/44h/1h/0h/0/0"),
), # tmQoJ3PTXgQLaRRZZYT6xk8XtjRbr2kCqwu
amount=300000000, amount=300000000,
prev_hash=TXHASH_e38206, prev_hash=TXHASH_e38206,
prev_index=0, prev_index=0,

Loading…
Cancel
Save