1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-06-27 10:22:34 +00:00

Wanchain support (#149)

This commit is contained in:
Peter van Mourik 2018-05-02 16:48:10 +02:00 committed by Pavol Rusnak
parent 5e90d5116c
commit 6a062ec5ea
3 changed files with 25 additions and 12 deletions

View File

@ -8,26 +8,26 @@ from . import networks
from .get_address import _ethereum_address_hex from .get_address import _ethereum_address_hex
async def require_confirm_tx(ctx, to, value, chain_id, token=None): async def require_confirm_tx(ctx, to, value, chain_id, token=None, tx_type=None):
if to: if to:
str_to = _ethereum_address_hex(to) str_to = _ethereum_address_hex(to)
else: else:
str_to = 'new contract?' str_to = 'new contract?'
content = Text('Confirm sending', ui.ICON_SEND, content = Text('Confirm sending', ui.ICON_SEND,
ui.BOLD, format_ethereum_amount(value, token, chain_id), ui.BOLD, format_ethereum_amount(value, token, chain_id, tx_type),
ui.NORMAL, 'to', ui.NORMAL, 'to',
ui.MONO, *split_address(str_to), ui.MONO, *split_address(str_to),
icon_color=ui.GREEN) icon_color=ui.GREEN)
await require_confirm(ctx, content, ButtonRequestType.SignTx) # we use SignTx, not ConfirmOutput, for compatibility with T1 await require_confirm(ctx, content, ButtonRequestType.SignTx) # we use SignTx, not ConfirmOutput, for compatibility with T1
async def require_confirm_fee(ctx, spending, gas_price, gas_limit, chain_id, token=None): async def require_confirm_fee(ctx, spending, gas_price, gas_limit, chain_id, token=None, tx_type=None):
content = Text('Confirm transaction', ui.ICON_SEND, content = Text('Confirm transaction', ui.ICON_SEND,
ui.BOLD, format_ethereum_amount(spending, token, chain_id), ui.BOLD, format_ethereum_amount(spending, token, chain_id, tx_type),
ui.NORMAL, 'Gas price:', ui.NORMAL, 'Gas price:',
ui.BOLD, format_ethereum_amount(gas_price, None, chain_id), ui.BOLD, format_ethereum_amount(gas_price, None, chain_id, tx_type),
ui.NORMAL, 'Maximum fee:', ui.NORMAL, 'Maximum fee:',
ui.BOLD, format_ethereum_amount(gas_price * gas_limit, None, chain_id), ui.BOLD, format_ethereum_amount(gas_price *gas_limit, None, chain_id, tx_type),
icon_color=ui.GREEN) icon_color=ui.GREEN)
await require_hold_to_confirm(ctx, content, ButtonRequestType.SignTx) await require_hold_to_confirm(ctx, content, ButtonRequestType.SignTx)
@ -51,12 +51,13 @@ def split_address(address):
return chunks(address, 17) return chunks(address, 17)
def format_ethereum_amount(value, token, chain_id): def format_ethereum_amount(value, token, chain_id, tx_type=None):
value = int.from_bytes(value, 'big')
if token: if token:
suffix = token[2] suffix = token[2]
decimals = token[3] decimals = token[3]
else: else:
suffix = networks.suffix_by_chain_id(chain_id) suffix = networks.suffix_by_chain_id(chain_id, tx_type)
decimals = 18 decimals = 18
if value <= 1e9: if value <= 1e9:

View File

@ -12,5 +12,8 @@ suffixes = {
} }
def suffix_by_chain_id(chain_id): def suffix_by_chain_id(chain_id, tx_type=None):
if (tx_type==1 or tx_type==6) and (chain_id==1 or chain_id==3):
return"WAN"
else:
return suffixes.get(chain_id, 'UNKN') return suffixes.get(chain_id, 'UNKN')

View File

@ -31,11 +31,11 @@ async def ethereum_sign_tx(ctx, msg):
recipient = msg.data_initial_chunk[16:36] recipient = msg.data_initial_chunk[16:36]
value = int.from_bytes(msg.data_initial_chunk[36:68], 'big') value = int.from_bytes(msg.data_initial_chunk[36:68], 'big')
await require_confirm_tx(ctx, recipient, value, msg.chain_id, token) await require_confirm_tx(ctx, recipient, value, msg.chain_id, token, msg.tx_type)
if token is None and msg.data_length > 0: if token is None and msg.data_length > 0:
await require_confirm_data(ctx, msg.data_initial_chunk, data_total) await require_confirm_data(ctx, msg.data_initial_chunk, data_total)
await require_confirm_fee(ctx, value, int.from_bytes(msg.gas_price, 'big'), int.from_bytes(msg.gas_limit, 'big'), msg.chain_id, token) await require_confirm_fee(ctx, value, int.from_bytes(msg.gas_price, 'big'), int.from_bytes(msg.gas_limit, 'big'), msg.chain_id, token, msg.tx_type)
data = bytearray() data = bytearray()
data += msg.data_initial_chunk data += msg.data_initial_chunk
@ -46,6 +46,9 @@ async def ethereum_sign_tx(ctx, msg):
sha = HashWriter(sha3_256) sha = HashWriter(sha3_256)
sha.extend(rlp.encode_length(total_length, True)) # total length sha.extend(rlp.encode_length(total_length, True)) # total length
if not msg.tx_type is None:
sha.extend(rlp.encode(msg.tx_type))
for field in [msg.nonce, msg.gas_price, msg.gas_limit, msg.to, msg.value]: for field in [msg.nonce, msg.gas_price, msg.gas_limit, msg.to, msg.value]:
sha.extend(rlp.encode(field)) sha.extend(rlp.encode(field))
@ -72,6 +75,9 @@ async def ethereum_sign_tx(ctx, msg):
def get_total_length(msg: EthereumSignTx, data_total: int) -> int: def get_total_length(msg: EthereumSignTx, data_total: int) -> int:
length = 0 length = 0
if not msg.tx_type is None:
length += rlp.field_length(1, [msg.tx_type])
for field in [msg.nonce, msg.gas_price, msg.gas_limit, msg.to, msg.value]: for field in [msg.nonce, msg.gas_price, msg.gas_limit, msg.to, msg.value]:
length += rlp.field_length(len(field), field[:1]) length += rlp.field_length(len(field), field[:1])
@ -123,6 +129,9 @@ def node_derive(root, address_n: list):
def check(msg: EthereumSignTx): def check(msg: EthereumSignTx):
if msg.tx_type not in [1, 6, None]:
raise ValueError(FailureType.DataError, 'Txtype out of bounds')
if msg.chain_id < 0 or msg.chain_id > MAX_CHAIN_ID: if msg.chain_id < 0 or msg.chain_id > MAX_CHAIN_ID:
raise wire.DataError('Chain id out of bounds') raise wire.DataError('Chain id out of bounds')