mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-06-26 01:42:34 +00:00
feat(core): add success screen to transactions' signature flow
This commit is contained in:
parent
946fc89449
commit
1bdc48a73f
@ -1 +1 @@
|
|||||||
[T3T1] Show confirmation layout after sending response to host.
|
[T3T1] Show confirmation layout after sending address, public key or signature to host.
|
||||||
|
@ -17,6 +17,7 @@ if TYPE_CHECKING:
|
|||||||
TxAckPrevOutput,
|
TxAckPrevOutput,
|
||||||
TxRequest,
|
TxRequest,
|
||||||
)
|
)
|
||||||
|
from trezor.wire import EarlyResponse
|
||||||
|
|
||||||
from apps.common.coininfo import CoinInfo
|
from apps.common.coininfo import CoinInfo
|
||||||
from apps.common.keychain import Keychain
|
from apps.common.keychain import Keychain
|
||||||
@ -51,9 +52,12 @@ async def sign_tx(
|
|||||||
keychain: Keychain,
|
keychain: Keychain,
|
||||||
coin: CoinInfo,
|
coin: CoinInfo,
|
||||||
authorization: CoinJoinAuthorization | None = None,
|
authorization: CoinJoinAuthorization | None = None,
|
||||||
) -> TxRequest:
|
) -> EarlyResponse[TxRequest]:
|
||||||
|
from trezor import TR
|
||||||
from trezor.enums import RequestType
|
from trezor.enums import RequestType
|
||||||
from trezor.messages import TxRequest
|
from trezor.messages import TxRequest
|
||||||
|
from trezor.ui.layouts import show_continue_in_app
|
||||||
|
from trezor.wire import early_response
|
||||||
from trezor.wire.context import call
|
from trezor.wire.context import call
|
||||||
|
|
||||||
from ..common import BITCOIN_NAMES
|
from ..common import BITCOIN_NAMES
|
||||||
@ -93,7 +97,9 @@ async def sign_tx(
|
|||||||
request_class, req = req
|
request_class, req = req
|
||||||
assert TxRequest.is_type_of(req)
|
assert TxRequest.is_type_of(req)
|
||||||
if req.request_type == RequestType.TXFINISHED:
|
if req.request_type == RequestType.TXFINISHED:
|
||||||
return req
|
return await early_response(
|
||||||
|
req, show_continue_in_app(TR.send__transaction_signed)
|
||||||
|
)
|
||||||
res = await call(req, request_class)
|
res = await call(req, request_class)
|
||||||
elif isinstance(req, helpers.UiConfirm):
|
elif isinstance(req, helpers.UiConfirm):
|
||||||
res = await req.confirm_dialog()
|
res = await req.confirm_dialog()
|
||||||
|
@ -6,15 +6,18 @@ if TYPE_CHECKING:
|
|||||||
from typing import Type
|
from typing import Type
|
||||||
|
|
||||||
from trezor.messages import CardanoSignTxFinished, CardanoSignTxInit
|
from trezor.messages import CardanoSignTxFinished, CardanoSignTxInit
|
||||||
|
from trezor.wire import EarlyResponse
|
||||||
|
|
||||||
|
|
||||||
@seed.with_keychain
|
@seed.with_keychain
|
||||||
async def sign_tx(
|
async def sign_tx(
|
||||||
msg: CardanoSignTxInit, keychain: seed.Keychain
|
msg: CardanoSignTxInit, keychain: seed.Keychain
|
||||||
) -> CardanoSignTxFinished:
|
) -> EarlyResponse[CardanoSignTxFinished]:
|
||||||
from trezor import log, wire
|
from trezor import TR, log, wire
|
||||||
from trezor.enums import CardanoTxSigningMode
|
from trezor.enums import CardanoTxSigningMode
|
||||||
from trezor.messages import CardanoSignTxFinished
|
from trezor.messages import CardanoSignTxFinished
|
||||||
|
from trezor.ui.layouts import show_continue_in_app
|
||||||
|
from trezor.wire import early_response
|
||||||
|
|
||||||
from .signer import Signer
|
from .signer import Signer
|
||||||
|
|
||||||
@ -49,4 +52,5 @@ async def sign_tx(
|
|||||||
log.exception(__name__, e)
|
log.exception(__name__, e)
|
||||||
raise wire.ProcessError("Signing failed")
|
raise wire.ProcessError("Signing failed")
|
||||||
|
|
||||||
return CardanoSignTxFinished()
|
resp = CardanoSignTxFinished()
|
||||||
|
return await early_response(resp, show_continue_in_app(TR.send__transaction_signed))
|
||||||
|
@ -4,17 +4,20 @@ from apps.common.keychain import auto_keychain
|
|||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from trezor.messages import EosSignedTx, EosSignTx
|
from trezor.messages import EosSignedTx, EosSignTx
|
||||||
|
from trezor.wire import EarlyResponse
|
||||||
|
|
||||||
from apps.common.keychain import Keychain
|
from apps.common.keychain import Keychain
|
||||||
|
|
||||||
|
|
||||||
@auto_keychain(__name__)
|
@auto_keychain(__name__)
|
||||||
async def sign_tx(msg: EosSignTx, keychain: Keychain) -> EosSignedTx:
|
async def sign_tx(msg: EosSignTx, keychain: Keychain) -> EarlyResponse[EosSignedTx]:
|
||||||
|
from trezor import TR
|
||||||
from trezor.crypto.curve import secp256k1
|
from trezor.crypto.curve import secp256k1
|
||||||
from trezor.crypto.hashlib import sha256
|
from trezor.crypto.hashlib import sha256
|
||||||
from trezor.messages import EosSignedTx, EosTxActionAck, EosTxActionRequest
|
from trezor.messages import EosSignedTx, EosTxActionAck, EosTxActionRequest
|
||||||
|
from trezor.ui.layouts import show_continue_in_app
|
||||||
from trezor.utils import HashWriter
|
from trezor.utils import HashWriter
|
||||||
from trezor.wire import DataError
|
from trezor.wire import DataError, early_response
|
||||||
from trezor.wire.context import call
|
from trezor.wire.context import call
|
||||||
|
|
||||||
from apps.common import paths
|
from apps.common import paths
|
||||||
@ -55,4 +58,5 @@ async def sign_tx(msg: EosSignTx, keychain: Keychain) -> EosSignedTx:
|
|||||||
node.private_key(), digest, True, secp256k1.CANONICAL_SIG_EOS
|
node.private_key(), digest, True, secp256k1.CANONICAL_SIG_EOS
|
||||||
)
|
)
|
||||||
|
|
||||||
return EosSignedTx(signature=base58_encode("SIG_", "K1", signature))
|
resp = EosSignedTx(signature=base58_encode("SIG_", "K1", signature))
|
||||||
|
return await early_response(resp, show_continue_in_app(TR.send__transaction_signed))
|
||||||
|
@ -19,6 +19,7 @@ if TYPE_CHECKING:
|
|||||||
EthereumTokenInfo,
|
EthereumTokenInfo,
|
||||||
EthereumTxAck,
|
EthereumTxAck,
|
||||||
)
|
)
|
||||||
|
from trezor.wire import EarlyResponse
|
||||||
|
|
||||||
from apps.common.keychain import Keychain
|
from apps.common.keychain import Keychain
|
||||||
|
|
||||||
@ -37,11 +38,13 @@ async def sign_tx(
|
|||||||
msg: EthereumSignTx,
|
msg: EthereumSignTx,
|
||||||
keychain: Keychain,
|
keychain: Keychain,
|
||||||
defs: Definitions,
|
defs: Definitions,
|
||||||
) -> EthereumTxRequest:
|
) -> EarlyResponse[EthereumTxRequest]:
|
||||||
from trezor import TR
|
from trezor import TR
|
||||||
from trezor.crypto.hashlib import sha3_256
|
from trezor.crypto.hashlib import sha3_256
|
||||||
|
from trezor.ui.layouts import show_continue_in_app
|
||||||
from trezor.ui.layouts.progress import progress
|
from trezor.ui.layouts.progress import progress
|
||||||
from trezor.utils import HashWriter
|
from trezor.utils import HashWriter
|
||||||
|
from trezor.wire import early_response
|
||||||
|
|
||||||
from apps.common import paths
|
from apps.common import paths
|
||||||
|
|
||||||
@ -111,7 +114,9 @@ async def sign_tx(
|
|||||||
|
|
||||||
progress_obj.stop()
|
progress_obj.stop()
|
||||||
|
|
||||||
return result
|
return await early_response(
|
||||||
|
result, show_continue_in_app(TR.send__transaction_signed)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
async def confirm_tx_data(
|
async def confirm_tx_data(
|
||||||
|
@ -2,6 +2,7 @@ from micropython import const
|
|||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
from trezor.crypto import rlp
|
from trezor.crypto import rlp
|
||||||
|
from trezor.wire import EarlyResponse
|
||||||
|
|
||||||
from .helpers import bytes_from_address
|
from .helpers import bytes_from_address
|
||||||
from .keychain import with_keychain_from_chain_id
|
from .keychain import with_keychain_from_chain_id
|
||||||
@ -34,11 +35,13 @@ async def sign_tx_eip1559(
|
|||||||
msg: EthereumSignTxEIP1559,
|
msg: EthereumSignTxEIP1559,
|
||||||
keychain: Keychain,
|
keychain: Keychain,
|
||||||
defs: Definitions,
|
defs: Definitions,
|
||||||
) -> EthereumTxRequest:
|
) -> EarlyResponse[EthereumTxRequest]:
|
||||||
from trezor import wire
|
from trezor import TR, wire
|
||||||
from trezor.crypto import rlp # local_cache_global
|
from trezor.crypto import rlp # local_cache_global
|
||||||
from trezor.crypto.hashlib import sha3_256
|
from trezor.crypto.hashlib import sha3_256
|
||||||
|
from trezor.ui.layouts import show_continue_in_app
|
||||||
from trezor.utils import HashWriter
|
from trezor.utils import HashWriter
|
||||||
|
from trezor.wire import early_response
|
||||||
|
|
||||||
from apps.common import paths
|
from apps.common import paths
|
||||||
|
|
||||||
@ -121,7 +124,9 @@ async def sign_tx_eip1559(
|
|||||||
digest = sha.get_digest()
|
digest = sha.get_digest()
|
||||||
result = _sign_digest(msg, keychain, digest)
|
result = _sign_digest(msg, keychain, digest)
|
||||||
|
|
||||||
return result
|
return await early_response(
|
||||||
|
result, show_continue_in_app(TR.send__transaction_signed)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def _get_total_length(msg: EthereumSignTxEIP1559, data_total: int) -> int:
|
def _get_total_length(msg: EthereumSignTxEIP1559, data_total: int) -> int:
|
||||||
|
@ -5,16 +5,21 @@ from apps.monero.layout import MoneroTransactionProgress
|
|||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from trezor.messages import MoneroTransactionFinalAck
|
from trezor.messages import MoneroTransactionFinalAck
|
||||||
|
from trezor.wire import EarlyResponse
|
||||||
|
|
||||||
from apps.common.keychain import Keychain
|
from apps.common.keychain import Keychain
|
||||||
from apps.monero.signing.state import State
|
from apps.monero.signing.state import State
|
||||||
|
|
||||||
|
|
||||||
@auto_keychain(__name__)
|
@auto_keychain(__name__)
|
||||||
async def sign_tx(received_msg, keychain: Keychain) -> MoneroTransactionFinalAck:
|
async def sign_tx(
|
||||||
|
received_msg, keychain: Keychain
|
||||||
|
) -> EarlyResponse[MoneroTransactionFinalAck]:
|
||||||
import gc
|
import gc
|
||||||
|
|
||||||
from trezor import log, utils
|
from trezor import TR, log, utils
|
||||||
|
from trezor.ui.layouts import show_continue_in_app
|
||||||
|
from trezor.wire import early_response
|
||||||
from trezor.wire.context import get_context
|
from trezor.wire.context import get_context
|
||||||
|
|
||||||
from apps.monero.signing.state import State
|
from apps.monero.signing.state import State
|
||||||
@ -45,7 +50,9 @@ async def sign_tx(received_msg, keychain: Keychain) -> MoneroTransactionFinalAck
|
|||||||
received_msg = await ctx.read(accept_msgs)
|
received_msg = await ctx.read(accept_msgs)
|
||||||
|
|
||||||
utils.unimport_end(mods)
|
utils.unimport_end(mods)
|
||||||
return result_msg
|
return await early_response(
|
||||||
|
result_msg, show_continue_in_app(TR.send__transaction_signed)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
async def _sign_tx_dispatch(
|
async def _sign_tx_dispatch(
|
||||||
|
@ -4,18 +4,23 @@ from apps.common.keychain import auto_keychain
|
|||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from trezor.messages import RippleSignedTx, RippleSignTx
|
from trezor.messages import RippleSignedTx, RippleSignTx
|
||||||
|
from trezor.wire import EarlyResponse
|
||||||
|
|
||||||
from apps.common.keychain import Keychain
|
from apps.common.keychain import Keychain
|
||||||
|
|
||||||
|
|
||||||
# NOTE: it is one big function because that way it is the most flash-space-efficient
|
# NOTE: it is one big function because that way it is the most flash-space-efficient
|
||||||
@auto_keychain(__name__)
|
@auto_keychain(__name__)
|
||||||
async def sign_tx(msg: RippleSignTx, keychain: Keychain) -> RippleSignedTx:
|
async def sign_tx(
|
||||||
|
msg: RippleSignTx, keychain: Keychain
|
||||||
|
) -> EarlyResponse[RippleSignedTx]:
|
||||||
|
from trezor import TR
|
||||||
from trezor.crypto import der
|
from trezor.crypto import der
|
||||||
from trezor.crypto.curve import secp256k1
|
from trezor.crypto.curve import secp256k1
|
||||||
from trezor.crypto.hashlib import sha512
|
from trezor.crypto.hashlib import sha512
|
||||||
from trezor.messages import RippleSignedTx
|
from trezor.messages import RippleSignedTx
|
||||||
from trezor.wire import ProcessError
|
from trezor.ui.layouts import show_continue_in_app
|
||||||
|
from trezor.wire import ProcessError, early_response
|
||||||
|
|
||||||
from apps.common import paths
|
from apps.common import paths
|
||||||
|
|
||||||
@ -58,4 +63,5 @@ async def sign_tx(msg: RippleSignTx, keychain: Keychain) -> RippleSignedTx:
|
|||||||
sig_encoded = der.encode_seq((sig[1:33], sig[33:65]))
|
sig_encoded = der.encode_seq((sig[1:33], sig[33:65]))
|
||||||
|
|
||||||
tx = serialize(msg, source_address, node.public_key(), sig_encoded)
|
tx = serialize(msg, source_address, node.public_key(), sig_encoded)
|
||||||
return RippleSignedTx(signature=sig_encoded, serialized_tx=tx)
|
resp = RippleSignedTx(signature=sig_encoded, serialized_tx=tx)
|
||||||
|
return await early_response(resp, show_continue_in_app(TR.send__transaction_signed))
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
from trezor.wire import DataError
|
from trezor.wire import DataError, EarlyResponse
|
||||||
|
|
||||||
from apps.common.keychain import with_slip44_keychain
|
from apps.common.keychain import with_slip44_keychain
|
||||||
|
|
||||||
@ -18,12 +18,13 @@ if TYPE_CHECKING:
|
|||||||
async def sign_tx(
|
async def sign_tx(
|
||||||
msg: SolanaSignTx,
|
msg: SolanaSignTx,
|
||||||
keychain: Keychain,
|
keychain: Keychain,
|
||||||
) -> SolanaTxSignature:
|
) -> EarlyResponse[SolanaTxSignature]:
|
||||||
from trezor import TR
|
from trezor import TR
|
||||||
from trezor.crypto.curve import ed25519
|
from trezor.crypto.curve import ed25519
|
||||||
from trezor.enums import ButtonRequestType
|
from trezor.enums import ButtonRequestType
|
||||||
from trezor.messages import SolanaTxSignature
|
from trezor.messages import SolanaTxSignature
|
||||||
from trezor.ui.layouts import confirm_metadata, show_warning
|
from trezor.ui.layouts import confirm_metadata, show_continue_in_app, show_warning
|
||||||
|
from trezor.wire import early_response
|
||||||
|
|
||||||
from apps.common import seed
|
from apps.common import seed
|
||||||
|
|
||||||
@ -80,7 +81,8 @@ async def sign_tx(
|
|||||||
|
|
||||||
signature = ed25519.sign(node.private_key(), serialized_tx)
|
signature = ed25519.sign(node.private_key(), serialized_tx)
|
||||||
|
|
||||||
return SolanaTxSignature(signature=signature)
|
resp = SolanaTxSignature(signature=signature)
|
||||||
|
return await early_response(resp, show_continue_in_app(TR.send__transaction_signed))
|
||||||
|
|
||||||
|
|
||||||
def _has_unsupported_instructions(transaction: Transaction) -> bool:
|
def _has_unsupported_instructions(transaction: Transaction) -> bool:
|
||||||
|
@ -4,19 +4,24 @@ from apps.common.keychain import auto_keychain
|
|||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from trezor.messages import StellarSignedTx, StellarSignTx
|
from trezor.messages import StellarSignedTx, StellarSignTx
|
||||||
|
from trezor.wire import EarlyResponse
|
||||||
|
|
||||||
from apps.common.keychain import Keychain
|
from apps.common.keychain import Keychain
|
||||||
|
|
||||||
|
|
||||||
@auto_keychain(__name__)
|
@auto_keychain(__name__)
|
||||||
async def sign_tx(msg: StellarSignTx, keychain: Keychain) -> StellarSignedTx:
|
async def sign_tx(
|
||||||
|
msg: StellarSignTx, keychain: Keychain
|
||||||
|
) -> EarlyResponse[StellarSignedTx]:
|
||||||
from ubinascii import hexlify
|
from ubinascii import hexlify
|
||||||
|
|
||||||
|
from trezor import TR
|
||||||
from trezor.crypto.curve import ed25519
|
from trezor.crypto.curve import ed25519
|
||||||
from trezor.crypto.hashlib import sha256
|
from trezor.crypto.hashlib import sha256
|
||||||
from trezor.enums import StellarMemoType
|
from trezor.enums import StellarMemoType
|
||||||
from trezor.messages import StellarSignedTx, StellarTxOpRequest
|
from trezor.messages import StellarSignedTx, StellarTxOpRequest
|
||||||
from trezor.wire import DataError, ProcessError
|
from trezor.ui.layouts import show_continue_in_app
|
||||||
|
from trezor.wire import DataError, ProcessError, early_response
|
||||||
from trezor.wire.context import call_any
|
from trezor.wire.context import call_any
|
||||||
|
|
||||||
from apps.common import paths, seed
|
from apps.common import paths, seed
|
||||||
@ -116,4 +121,5 @@ async def sign_tx(msg: StellarSignTx, keychain: Keychain) -> StellarSignedTx:
|
|||||||
signature = ed25519.sign(node.private_key(), digest)
|
signature = ed25519.sign(node.private_key(), digest)
|
||||||
|
|
||||||
# Add the public key for verification that the right account was used for signing
|
# Add the public key for verification that the right account was used for signing
|
||||||
return StellarSignedTx(public_key=pubkey, signature=signature)
|
resp = StellarSignedTx(public_key=pubkey, signature=signature)
|
||||||
|
return await early_response(resp, show_continue_in_app(TR.send__transaction_signed))
|
||||||
|
@ -26,16 +26,20 @@ if TYPE_CHECKING:
|
|||||||
TezosTransactionOp,
|
TezosTransactionOp,
|
||||||
)
|
)
|
||||||
from trezor.utils import Writer
|
from trezor.utils import Writer
|
||||||
|
from trezor.wire import EarlyResponse
|
||||||
|
|
||||||
from apps.common.keychain import Keychain
|
from apps.common.keychain import Keychain
|
||||||
|
|
||||||
|
|
||||||
@with_slip44_keychain(*PATTERNS, slip44_id=SLIP44_ID, curve=CURVE)
|
@with_slip44_keychain(*PATTERNS, slip44_id=SLIP44_ID, curve=CURVE)
|
||||||
async def sign_tx(msg: TezosSignTx, keychain: Keychain) -> TezosSignedTx:
|
async def sign_tx(msg: TezosSignTx, keychain: Keychain) -> EarlyResponse[TezosSignedTx]:
|
||||||
|
from trezor import TR
|
||||||
from trezor.crypto import hashlib
|
from trezor.crypto import hashlib
|
||||||
from trezor.crypto.curve import ed25519
|
from trezor.crypto.curve import ed25519
|
||||||
from trezor.enums import TezosBallotType
|
from trezor.enums import TezosBallotType
|
||||||
from trezor.messages import TezosSignedTx
|
from trezor.messages import TezosSignedTx
|
||||||
|
from trezor.ui.layouts import show_continue_in_app
|
||||||
|
from trezor.wire import early_response
|
||||||
|
|
||||||
from apps.common.paths import validate_path
|
from apps.common.paths import validate_path
|
||||||
|
|
||||||
@ -155,9 +159,10 @@ async def sign_tx(msg: TezosSignTx, keychain: Keychain) -> TezosSignedTx:
|
|||||||
|
|
||||||
sig_prefixed = base58_encode_check(signature, helpers.TEZOS_SIGNATURE_PREFIX)
|
sig_prefixed = base58_encode_check(signature, helpers.TEZOS_SIGNATURE_PREFIX)
|
||||||
|
|
||||||
return TezosSignedTx(
|
resp = TezosSignedTx(
|
||||||
signature=sig_prefixed, sig_op_contents=sig_op_contents, operation_hash=ophash
|
signature=sig_prefixed, sig_op_contents=sig_op_contents, operation_hash=ophash
|
||||||
)
|
)
|
||||||
|
return await early_response(resp, show_continue_in_app(TR.send__transaction_signed))
|
||||||
|
|
||||||
|
|
||||||
def _get_address_by_tag(address_hash: bytes) -> str:
|
def _get_address_by_tag(address_hash: bytes) -> str:
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user