mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-07-06 06:42:33 +00:00

as suggested by @andrewkozlik: TxAckInputType -> TxInput TxAckOutputType -> TxOutput TxAckPrevTxType -> PrevTx TxAckPrevInputType -> PrevInput TxAckPrevOutputType -> PrevOutput
65 lines
2.3 KiB
Python
65 lines
2.3 KiB
Python
from micropython import const
|
|
|
|
from trezor.messages import MessageType
|
|
|
|
from .common import BIP32_WALLET_DEPTH
|
|
|
|
if False:
|
|
from typing import Iterable
|
|
from trezor.messages.AuthorizeCoinJoin import AuthorizeCoinJoin
|
|
from trezor.messages.GetOwnershipProof import GetOwnershipProof
|
|
from trezor.messages.SignTx import SignTx
|
|
from trezor.messages.TxInput import TxInput
|
|
|
|
from apps.common.coininfo import CoinInfo
|
|
from apps.common.keychain import Keychain
|
|
|
|
_ROUND_ID_LEN = const(32)
|
|
FEE_PER_ANONYMITY_DECIMALS = const(9)
|
|
|
|
|
|
class CoinJoinAuthorization:
|
|
def __init__(
|
|
self, msg: AuthorizeCoinJoin, keychain: Keychain, coin: CoinInfo
|
|
) -> None:
|
|
self.coordinator = msg.coordinator
|
|
self.remaining_fee = msg.max_total_fee
|
|
self.fee_per_anonymity = msg.fee_per_anonymity or 0
|
|
self.address_n = msg.address_n
|
|
self.keychain = keychain
|
|
self.coin = coin
|
|
self.script_type = msg.script_type
|
|
|
|
def __del__(self) -> None:
|
|
self.keychain.__del__()
|
|
|
|
def expected_wire_types(self) -> Iterable[int]:
|
|
return (MessageType.SignTx, MessageType.GetOwnershipProof)
|
|
|
|
def check_get_ownership_proof(self, msg: GetOwnershipProof) -> bool:
|
|
# Check whether the current authorization matches the parameters of the request.
|
|
return (
|
|
len(msg.address_n) >= BIP32_WALLET_DEPTH
|
|
and msg.address_n[:-BIP32_WALLET_DEPTH] == self.address_n
|
|
and msg.coin_name == self.coin.coin_name
|
|
and msg.script_type == self.script_type
|
|
and len(msg.commitment_data) >= _ROUND_ID_LEN
|
|
and msg.commitment_data[:-_ROUND_ID_LEN] == self.coordinator.encode()
|
|
)
|
|
|
|
def check_sign_tx_input(self, txi: TxInput, coin: CoinInfo) -> bool:
|
|
# Check whether the current input matches the parameters of the request.
|
|
return (
|
|
len(txi.address_n) >= BIP32_WALLET_DEPTH
|
|
and txi.address_n[:-BIP32_WALLET_DEPTH] == self.address_n
|
|
and coin.coin_name == self.coin.coin_name
|
|
and txi.script_type == self.script_type
|
|
)
|
|
|
|
def approve_sign_tx(self, msg: SignTx, fee: int) -> bool:
|
|
if self.remaining_fee < fee or msg.coin_name != self.coin.coin_name:
|
|
return False
|
|
|
|
self.remaining_fee -= fee
|
|
return True
|