mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-02-21 03:52:04 +00:00
49 lines
1.9 KiB
Python
49 lines
1.9 KiB
Python
from trezor import ui, wire
|
|
from trezor.messages.MessageType import TxAck
|
|
from trezor.messages.TxRequest import TxRequest
|
|
from trezor.messages.RequestType import TXFINISHED
|
|
from apps.common import seed
|
|
from apps.wallet.sign_tx.helpers import UiConfirmOutput, UiConfirmTotal, UiConfirmFeeOverThreshold, UiConfirmForeignAddress
|
|
|
|
|
|
@ui.layout
|
|
async def sign_tx(ctx, msg):
|
|
from apps.wallet.sign_tx import layout, progress, signing
|
|
|
|
# TODO: rework this so we don't have to pass root to signing.sign_tx
|
|
root = await seed.derive_node(ctx, [])
|
|
|
|
signer = signing.sign_tx(msg, root)
|
|
res = None
|
|
while True:
|
|
try:
|
|
req = signer.send(res)
|
|
except signing.SigningError as e:
|
|
raise wire.Error(*e.args)
|
|
except signing.MultisigError as e:
|
|
raise wire.Error(*e.args)
|
|
except signing.AddressError as e:
|
|
raise wire.Error(*e.args)
|
|
except signing.ScriptsError as e:
|
|
raise wire.Error(*e.args)
|
|
except signing.Bip143Error as e:
|
|
raise wire.Error(*e.args)
|
|
if isinstance(req, TxRequest):
|
|
if req.request_type == TXFINISHED:
|
|
break
|
|
res = await ctx.call(req, TxAck)
|
|
elif isinstance(req, UiConfirmOutput):
|
|
res = await layout.confirm_output(ctx, req.output, req.coin)
|
|
progress.report_init()
|
|
elif isinstance(req, UiConfirmTotal):
|
|
res = await layout.confirm_total(ctx, req.spending, req.fee, req.coin)
|
|
progress.report_init()
|
|
elif isinstance(req, UiConfirmFeeOverThreshold):
|
|
res = await layout.confirm_feeoverthreshold(ctx, req.fee, req.coin)
|
|
progress.report_init()
|
|
elif isinstance(req, UiConfirmForeignAddress):
|
|
res = await layout.confirm_foreign_address(ctx, req.address_n, req.coin)
|
|
else:
|
|
raise TypeError('Invalid signing instruction')
|
|
return req
|