1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-23 23:08:14 +00:00

feat(core/bitcoin): show lock_time as human readable datetime

This commit is contained in:
matejcik 2021-10-27 14:45:51 +02:00 committed by matejcik
parent 1d72085b5c
commit f7c340f333
3 changed files with 108 additions and 4 deletions

View File

@ -3,7 +3,7 @@ from ubinascii import hexlify
from trezor import utils from trezor import utils
from trezor.enums import AmountUnit, ButtonRequestType, OutputScriptType from trezor.enums import AmountUnit, ButtonRequestType, OutputScriptType
from trezor.strings import format_amount from trezor.strings import format_amount, format_timestamp
from trezor.ui import layouts from trezor.ui import layouts
from .. import addresses from .. import addresses
@ -193,8 +193,8 @@ async def confirm_nondefault_locktime(
param = str(lock_time) param = str(lock_time)
else: else:
title = "Confirm locktime" title = "Confirm locktime"
text = "Locktime for this\ntransaction is set to\ntimestamp:\n{}" text = "Locktime for this\ntransaction is set to:\n{}"
param = str(lock_time) param = format_timestamp(lock_time)
await layouts.confirm_metadata( await layouts.confirm_metadata(
ctx, ctx,

View File

@ -14,6 +14,8 @@
# You should have received a copy of the License along with this library. # 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>. # If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
from datetime import datetime, timezone
import pytest import pytest
from trezorlib import btc, device, messages from trezorlib import btc, device, messages
@ -1389,3 +1391,102 @@ class TestMsgSigntx:
lock_time=lock_time, lock_time=lock_time,
prev_txes=TX_CACHE_MAINNET, prev_txes=TX_CACHE_MAINNET,
) )
@pytest.mark.skip_t1(reason="Cannot test layouts on T1")
def test_lock_time_blockheight(self, client):
# tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882
# input 0: 0.0039 BTC
inp1 = messages.TxInputType(
address_n=parse_path("44h/0h/0h/0/0"),
amount=390000,
prev_hash=TXHASH_d5f65e,
prev_index=0,
sequence=0xFFFF_FFFE,
)
out1 = messages.TxOutputType(
address="1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1",
amount=390000 - 10000,
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
def input_flow():
yield # confirm output
client.debug.wait_layout()
client.debug.press_yes()
yield # confirm locktime
layout = client.debug.wait_layout()
assert "blockheight" in layout.text
assert "499999999" in layout.text
client.debug.press_yes()
yield # confirm transaction
client.debug.press_yes()
with client:
client.set_input_flow(input_flow)
client.watch_layout(True)
btc.sign_tx(
client,
"Bitcoin",
[inp1],
[out1],
lock_time=499999999,
prev_txes=TX_CACHE_MAINNET,
)
@pytest.mark.skip_t1(reason="Cannot test layouts on T1")
@pytest.mark.parametrize(
"lock_time_str", ("1985-11-05 00:53:20", "2048-08-16 22:14:00")
)
def test_lock_time_datetime(self, client, lock_time_str):
# tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882
# input 0: 0.0039 BTC
inp1 = messages.TxInputType(
address_n=parse_path("44h/0h/0h/0/0"),
amount=390000,
prev_hash=TXHASH_d5f65e,
prev_index=0,
sequence=0xFFFF_FFFE,
)
out1 = messages.TxOutputType(
address="1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1",
amount=390000 - 10000,
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
def input_flow():
yield # confirm output
client.debug.wait_layout()
client.debug.press_yes()
yield # confirm locktime
layout = client.debug.wait_layout()
assert lock_time_str in layout.text
client.debug.press_yes()
yield # confirm transaction
client.debug.press_yes()
lock_time_naive = datetime.strptime(lock_time_str, "%Y-%m-%d %H:%M:%S")
lock_time_utc = lock_time_naive.replace(tzinfo=timezone.utc)
lock_time_timestamp = int(lock_time_utc.timestamp())
with client:
client.set_input_flow(input_flow)
client.watch_layout(True)
btc.sign_tx(
client,
"Bitcoin",
[inp1],
[out1],
lock_time=lock_time_timestamp,
prev_txes=TX_CACHE_MAINNET,
)

View File

@ -557,7 +557,10 @@
"test_msg_signtx.py-test_incorrect_output_script_type[OutputScriptType.PAYTOSCRIPTHASH]": "1c100ce4b7c1e47e72428f390de0846c1ff933e9f07894872644a369a9422738", "test_msg_signtx.py-test_incorrect_output_script_type[OutputScriptType.PAYTOSCRIPTHASH]": "1c100ce4b7c1e47e72428f390de0846c1ff933e9f07894872644a369a9422738",
"test_msg_signtx.py-test_lock_time[1-4294967295]": "25c535e867f8ed508c5aab8e8f6f67ed603d7c1166ad401b4cbe12e02f95fa6c", "test_msg_signtx.py-test_lock_time[1-4294967295]": "25c535e867f8ed508c5aab8e8f6f67ed603d7c1166ad401b4cbe12e02f95fa6c",
"test_msg_signtx.py-test_lock_time[499999999-4294967294]": "535f0fb6e8804cc450b68b7407f8fe59cd12f316951379b9ebf3ba18a88b2170", "test_msg_signtx.py-test_lock_time[499999999-4294967294]": "535f0fb6e8804cc450b68b7407f8fe59cd12f316951379b9ebf3ba18a88b2170",
"test_msg_signtx.py-test_lock_time[500000000-4294967294]": "b777e079b440d7174d13437e0a71428c482ae16bbbbe766eff71eca127a6f2e4", "test_msg_signtx.py-test_lock_time[500000000-4294967294]": "be7ef95ed73748467f97931b35cba9f864472448f16ff9c204550f06823bc7a5",
"test_msg_signtx.py-test_lock_time_blockheight": "535f0fb6e8804cc450b68b7407f8fe59cd12f316951379b9ebf3ba18a88b2170",
"test_msg_signtx.py-test_lock_time_datetime[1985-11-05 00:53:20]": "be7ef95ed73748467f97931b35cba9f864472448f16ff9c204550f06823bc7a5",
"test_msg_signtx.py-test_lock_time_datetime[2048-08-16 22:14:00]": "8af5a4ab4daa8299a08fc293b64843c8607eb38f9a52d67bd9f9c6540974334b",
"test_msg_signtx.py-test_lots_of_change": "fdcfedc0aa6186adbcf28d1bdde7daba617e7415dc1b0f8df43baf238fb29bf6", "test_msg_signtx.py-test_lots_of_change": "fdcfedc0aa6186adbcf28d1bdde7daba617e7415dc1b0f8df43baf238fb29bf6",
"test_msg_signtx.py-test_lots_of_inputs": "b7e38a8cb104b2658c93c16ef82ad6dc0629cfbce6f7b574147662537376ac9c", "test_msg_signtx.py-test_lots_of_inputs": "b7e38a8cb104b2658c93c16ef82ad6dc0629cfbce6f7b574147662537376ac9c",
"test_msg_signtx.py-test_lots_of_outputs": "d142f73b67902ea463a129eb5dc91ba033feaf987a6ee02eecd170836b8988ef", "test_msg_signtx.py-test_lots_of_outputs": "d142f73b67902ea463a129eb5dc91ba033feaf987a6ee02eecd170836b8988ef",