You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.7 KiB
76 lines
2.7 KiB
5 years ago
|
from trezor import utils, wire
|
||
6 years ago
|
from trezor.messages.RequestType import TXFINISHED
|
||
4 years ago
|
from trezor.messages.SignTx import SignTx
|
||
5 years ago
|
from trezor.messages.TxAck import TxAck
|
||
6 years ago
|
from trezor.messages.TxRequest import TxRequest
|
||
|
|
||
4 years ago
|
from ..keychain import with_keychain
|
||
4 years ago
|
from . import bitcoin, helpers, layout, progress
|
||
4 years ago
|
|
||
|
from apps.common import coininfo, paths, seed
|
||
8 years ago
|
|
||
4 years ago
|
if not utils.BITCOIN_ONLY:
|
||
4 years ago
|
from . import bitcoinlike, decred, zcash
|
||
4 years ago
|
|
||
4 years ago
|
if False:
|
||
4 years ago
|
from typing import Type, Union
|
||
|
|
||
|
|
||
|
BITCOIN_NAMES = ("Bitcoin", "Regtest", "Testnet")
|
||
8 years ago
|
|
||
4 years ago
|
|
||
4 years ago
|
@with_keychain
|
||
|
async def sign_tx(
|
||
|
ctx: wire.Context, msg: SignTx, keychain: seed.Keychain, coin: coininfo.CoinInfo
|
||
|
) -> TxRequest:
|
||
4 years ago
|
if not utils.BITCOIN_ONLY:
|
||
|
if coin.decred:
|
||
|
signer_class = decred.Decred # type: Type[bitcoin.Bitcoin]
|
||
|
elif coin.overwintered:
|
||
|
signer_class = zcash.Overwintered
|
||
4 years ago
|
elif coin.coin_name not in BITCOIN_NAMES:
|
||
4 years ago
|
signer_class = bitcoinlike.Bitcoinlike
|
||
4 years ago
|
else:
|
||
4 years ago
|
signer_class = bitcoin.Bitcoin
|
||
|
|
||
|
else:
|
||
|
signer_class = bitcoin.Bitcoin
|
||
|
|
||
4 years ago
|
signer = signer_class(msg, keychain, coin).signer()
|
||
8 years ago
|
|
||
4 years ago
|
res = None # type: Union[TxAck, bool, None]
|
||
8 years ago
|
while True:
|
||
4 years ago
|
req = signer.send(res)
|
||
6 years ago
|
if isinstance(req, TxRequest):
|
||
8 years ago
|
if req.request_type == TXFINISHED:
|
||
|
break
|
||
7 years ago
|
res = await ctx.call(req, TxAck)
|
||
6 years ago
|
elif isinstance(req, helpers.UiConfirmOutput):
|
||
5 years ago
|
mods = utils.unimport_begin()
|
||
7 years ago
|
res = await layout.confirm_output(ctx, req.output, req.coin)
|
||
5 years ago
|
utils.unimport_end(mods)
|
||
6 years ago
|
progress.report_init()
|
||
6 years ago
|
elif isinstance(req, helpers.UiConfirmTotal):
|
||
5 years ago
|
mods = utils.unimport_begin()
|
||
7 years ago
|
res = await layout.confirm_total(ctx, req.spending, req.fee, req.coin)
|
||
5 years ago
|
utils.unimport_end(mods)
|
||
6 years ago
|
progress.report_init()
|
||
6 years ago
|
elif isinstance(req, helpers.UiConfirmFeeOverThreshold):
|
||
5 years ago
|
mods = utils.unimport_begin()
|
||
7 years ago
|
res = await layout.confirm_feeoverthreshold(ctx, req.fee, req.coin)
|
||
5 years ago
|
utils.unimport_end(mods)
|
||
6 years ago
|
progress.report_init()
|
||
5 years ago
|
elif isinstance(req, helpers.UiConfirmNonDefaultLocktime):
|
||
5 years ago
|
mods = utils.unimport_begin()
|
||
5 years ago
|
res = await layout.confirm_nondefault_locktime(ctx, req.lock_time)
|
||
5 years ago
|
utils.unimport_end(mods)
|
||
5 years ago
|
progress.report_init()
|
||
6 years ago
|
elif isinstance(req, helpers.UiConfirmForeignAddress):
|
||
5 years ago
|
mods = utils.unimport_begin()
|
||
6 years ago
|
res = await paths.show_path_warning(ctx, req.address_n)
|
||
5 years ago
|
utils.unimport_end(mods)
|
||
5 years ago
|
progress.report_init()
|
||
8 years ago
|
else:
|
||
6 years ago
|
raise TypeError("Invalid signing instruction")
|
||
8 years ago
|
return req
|