mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-01-23 22:01:01 +00:00
ripple: style fixes
This commit is contained in:
parent
08945c48e1
commit
66b8bbb1a5
src/apps/ripple
@ -1,16 +1,16 @@
|
||||
from trezor.wire import register, protobuf_workflow
|
||||
from trezor.messages.MessageType import RippleGetAddress
|
||||
from trezor.messages.MessageType import RippleSignTx
|
||||
from .get_address import get_address
|
||||
from trezor.messages.MessageType import RippleGetAddress, RippleSignTx
|
||||
from trezor.wire import protobuf_workflow, register
|
||||
|
||||
|
||||
def dispatch_RippleGetAddress(*args, **kwargs):
|
||||
from .get_address import get_address
|
||||
|
||||
return get_address(*args, **kwargs)
|
||||
|
||||
|
||||
def dispatch_RippleSignTx(*args, **kwargs):
|
||||
from .sign_tx import sign_tx
|
||||
|
||||
return sign_tx(*args, **kwargs)
|
||||
|
||||
|
||||
|
@ -1,9 +1,11 @@
|
||||
from apps.common import seed
|
||||
from apps.common.display_address import show_address, show_qr
|
||||
from trezor.messages.RippleAddress import RippleAddress
|
||||
from trezor.messages.RippleGetAddress import RippleGetAddress
|
||||
|
||||
from . import helpers
|
||||
|
||||
from apps.common import seed
|
||||
from apps.common.display_address import show_address, show_qr
|
||||
|
||||
|
||||
async def get_address(ctx, msg: RippleGetAddress):
|
||||
node = await seed.derive_node(ctx, msg.address_n)
|
||||
|
@ -1,23 +1,25 @@
|
||||
from apps.common.confirm import require_confirm, require_hold_to_confirm
|
||||
from apps.common.display_address import split_address
|
||||
from trezor import ui
|
||||
from trezor.messages import ButtonRequestType
|
||||
from trezor.ui.text import Text
|
||||
from trezor.utils import format_amount
|
||||
|
||||
from . import helpers
|
||||
|
||||
from apps.common.confirm import require_confirm, require_hold_to_confirm
|
||||
from apps.common.display_address import split_address
|
||||
|
||||
|
||||
async def require_confirm_fee(ctx, fee):
|
||||
text = Text('Confirm fee', ui.ICON_SEND, icon_color=ui.GREEN)
|
||||
text.normal('Transaction fee:')
|
||||
text.bold(format_amount(fee, helpers.DIVISIBILITY) + ' XRP')
|
||||
text = Text("Confirm fee", ui.ICON_SEND, icon_color=ui.GREEN)
|
||||
text.normal("Transaction fee:")
|
||||
text.bold(format_amount(fee, helpers.DIVISIBILITY) + " XRP")
|
||||
await require_confirm(ctx, text, ButtonRequestType.ConfirmOutput)
|
||||
|
||||
|
||||
async def require_confirm_tx(ctx, to, value):
|
||||
|
||||
text = Text('Confirm sending', ui.ICON_SEND, icon_color=ui.GREEN)
|
||||
text.bold(format_amount(value, helpers.DIVISIBILITY) + ' XRP')
|
||||
text.normal('to')
|
||||
text = Text("Confirm sending", ui.ICON_SEND, icon_color=ui.GREEN)
|
||||
text.bold(format_amount(value, helpers.DIVISIBILITY) + " XRP")
|
||||
text.normal("to")
|
||||
text.mono(*split_address(to))
|
||||
return await require_hold_to_confirm(ctx, text, ButtonRequestType.SignTx)
|
||||
|
@ -9,6 +9,7 @@
|
||||
# transaction type and the fields that are required for it.
|
||||
#
|
||||
from trezor.messages.RippleSignTx import RippleSignTx
|
||||
|
||||
from . import helpers
|
||||
|
||||
FIELD_TYPE_INT16 = 1
|
||||
@ -18,66 +19,34 @@ FIELD_TYPE_VL = 7
|
||||
FIELD_TYPE_ACCOUNT = 8
|
||||
|
||||
FIELDS_MAP = {
|
||||
'account': {
|
||||
'type': FIELD_TYPE_ACCOUNT,
|
||||
'key': 1,
|
||||
},
|
||||
'amount': {
|
||||
'type': FIELD_TYPE_AMOUNT,
|
||||
'key': 1,
|
||||
},
|
||||
'destination': {
|
||||
'type': FIELD_TYPE_ACCOUNT,
|
||||
'key': 3,
|
||||
},
|
||||
'fee': {
|
||||
'type': FIELD_TYPE_AMOUNT,
|
||||
'key': 8,
|
||||
},
|
||||
'sequence': {
|
||||
'type': FIELD_TYPE_INT32,
|
||||
'key': 4,
|
||||
},
|
||||
'type': {
|
||||
'type': FIELD_TYPE_INT16,
|
||||
'key': 2,
|
||||
},
|
||||
'signingPubKey': {
|
||||
'type': FIELD_TYPE_VL,
|
||||
'key': 3,
|
||||
},
|
||||
'flags': {
|
||||
'type': FIELD_TYPE_INT32,
|
||||
'key': 2,
|
||||
},
|
||||
'txnSignature': {
|
||||
'type': FIELD_TYPE_VL,
|
||||
'key': 4,
|
||||
},
|
||||
'lastLedgerSequence': {
|
||||
'type': FIELD_TYPE_INT32,
|
||||
'key': 27,
|
||||
},
|
||||
"account": {"type": FIELD_TYPE_ACCOUNT, "key": 1},
|
||||
"amount": {"type": FIELD_TYPE_AMOUNT, "key": 1},
|
||||
"destination": {"type": FIELD_TYPE_ACCOUNT, "key": 3},
|
||||
"fee": {"type": FIELD_TYPE_AMOUNT, "key": 8},
|
||||
"sequence": {"type": FIELD_TYPE_INT32, "key": 4},
|
||||
"type": {"type": FIELD_TYPE_INT16, "key": 2},
|
||||
"signingPubKey": {"type": FIELD_TYPE_VL, "key": 3},
|
||||
"flags": {"type": FIELD_TYPE_INT32, "key": 2},
|
||||
"txnSignature": {"type": FIELD_TYPE_VL, "key": 4},
|
||||
"lastLedgerSequence": {"type": FIELD_TYPE_INT32, "key": 27},
|
||||
}
|
||||
|
||||
TRANSACTION_TYPES = {
|
||||
'Payment': 0,
|
||||
}
|
||||
TRANSACTION_TYPES = {"Payment": 0}
|
||||
|
||||
|
||||
def serialize(msg: RippleSignTx, source_address: str, pubkey=None, signature=None):
|
||||
w = bytearray()
|
||||
# must be sorted numerically first by type and then by name
|
||||
write(w, FIELDS_MAP['type'], TRANSACTION_TYPES['Payment'])
|
||||
write(w, FIELDS_MAP['flags'], msg.flags)
|
||||
write(w, FIELDS_MAP['sequence'], msg.sequence)
|
||||
write(w, FIELDS_MAP['lastLedgerSequence'], msg.last_ledger_sequence)
|
||||
write(w, FIELDS_MAP['amount'], msg.payment.amount)
|
||||
write(w, FIELDS_MAP['fee'], msg.fee)
|
||||
write(w, FIELDS_MAP['signingPubKey'], pubkey)
|
||||
write(w, FIELDS_MAP['txnSignature'], signature)
|
||||
write(w, FIELDS_MAP['account'], source_address)
|
||||
write(w, FIELDS_MAP['destination'], msg.payment.destination)
|
||||
write(w, FIELDS_MAP["type"], TRANSACTION_TYPES["Payment"])
|
||||
write(w, FIELDS_MAP["flags"], msg.flags)
|
||||
write(w, FIELDS_MAP["sequence"], msg.sequence)
|
||||
write(w, FIELDS_MAP["lastLedgerSequence"], msg.last_ledger_sequence)
|
||||
write(w, FIELDS_MAP["amount"], msg.payment.amount)
|
||||
write(w, FIELDS_MAP["fee"], msg.fee)
|
||||
write(w, FIELDS_MAP["signingPubKey"], pubkey)
|
||||
write(w, FIELDS_MAP["txnSignature"], signature)
|
||||
write(w, FIELDS_MAP["account"], source_address)
|
||||
write(w, FIELDS_MAP["destination"], msg.payment.destination)
|
||||
return w
|
||||
|
||||
|
||||
@ -85,36 +54,36 @@ def write(w: bytearray, field: dict, value):
|
||||
if value is None:
|
||||
return
|
||||
write_type(w, field)
|
||||
if field['type'] == FIELD_TYPE_INT16:
|
||||
w.extend(value.to_bytes(2, 'big'))
|
||||
elif field['type'] == FIELD_TYPE_INT32:
|
||||
w.extend(value.to_bytes(4, 'big'))
|
||||
elif field['type'] == FIELD_TYPE_AMOUNT:
|
||||
if field["type"] == FIELD_TYPE_INT16:
|
||||
w.extend(value.to_bytes(2, "big"))
|
||||
elif field["type"] == FIELD_TYPE_INT32:
|
||||
w.extend(value.to_bytes(4, "big"))
|
||||
elif field["type"] == FIELD_TYPE_AMOUNT:
|
||||
w.extend(serialize_amount(value))
|
||||
elif field['type'] == FIELD_TYPE_ACCOUNT:
|
||||
elif field["type"] == FIELD_TYPE_ACCOUNT:
|
||||
write_bytes(w, helpers.decode_address(value))
|
||||
elif field['type'] == FIELD_TYPE_VL:
|
||||
elif field["type"] == FIELD_TYPE_VL:
|
||||
write_bytes(w, value)
|
||||
else:
|
||||
raise ValueError('Unknown field type')
|
||||
raise ValueError("Unknown field type")
|
||||
|
||||
|
||||
def write_type(w: bytearray, field: dict):
|
||||
if field['key'] <= 0xf:
|
||||
w.append((field['type'] << 4) | field['key'])
|
||||
if field["key"] <= 0xf:
|
||||
w.append((field["type"] << 4) | field["key"])
|
||||
else:
|
||||
# this concerns two-bytes fields such as lastLedgerSequence
|
||||
w.append(field['type'] << 4)
|
||||
w.append(field['key'])
|
||||
w.append(field["type"] << 4)
|
||||
w.append(field["key"])
|
||||
|
||||
|
||||
def serialize_amount(value: int) -> bytearray:
|
||||
if value < 0 or isinstance(value, float):
|
||||
raise ValueError('Only positive integers are supported')
|
||||
raise ValueError("Only positive integers are supported")
|
||||
if value > 100000000000: # max allowed value
|
||||
raise ValueError('Value is larger than 100000000000')
|
||||
raise ValueError("Value is larger than 100000000000")
|
||||
|
||||
b = bytearray(value.to_bytes(8, 'big'))
|
||||
b = bytearray(value.to_bytes(8, "big"))
|
||||
# Clear first bit to indicate XRP
|
||||
b[0] &= 0x7f
|
||||
# Set second bit to indicate positive number
|
||||
@ -145,12 +114,8 @@ def serialize_varint(w, val):
|
||||
b.extend([193 + rshift(val, 8), val & 0xff])
|
||||
elif val <= 918744:
|
||||
val -= 12481
|
||||
b.extend([
|
||||
241 + rshift(val, 16),
|
||||
rshift(val, 8) & 0xff,
|
||||
val & 0xff
|
||||
])
|
||||
b.extend([241 + rshift(val, 16), rshift(val, 8) & 0xff, val & 0xff])
|
||||
else:
|
||||
raise ValueError('Variable integer overflow.')
|
||||
raise ValueError("Variable integer overflow.")
|
||||
|
||||
w.extend(b)
|
||||
|
@ -1,13 +1,14 @@
|
||||
from apps.common import seed
|
||||
from trezor.crypto import der
|
||||
from trezor.crypto.curve import secp256k1
|
||||
from trezor.crypto.hashlib import sha512
|
||||
from trezor.messages.RippleSignTx import RippleSignTx
|
||||
from trezor.messages.RippleSignedTx import RippleSignedTx
|
||||
from trezor.messages.RippleSignTx import RippleSignTx
|
||||
from trezor.wire import ProcessError
|
||||
|
||||
from . import helpers, layout
|
||||
from .serialize import serialize
|
||||
from . import helpers
|
||||
from . import layout
|
||||
|
||||
from apps.common import seed
|
||||
|
||||
|
||||
async def sign_tx(ctx, msg: RippleSignTx):
|
||||
@ -30,12 +31,12 @@ async def sign_tx(ctx, msg: RippleSignTx):
|
||||
|
||||
def check_fee(fee: int):
|
||||
if fee < helpers.MIN_FEE or fee > helpers.MAX_FEE:
|
||||
raise ProcessError('Fee must be in the range of 10 to 10,000 drops')
|
||||
raise ProcessError("Fee must be in the range of 10 to 10,000 drops")
|
||||
|
||||
|
||||
def get_network_prefix():
|
||||
"""Network prefix is prepended before the transaction and public key is included"""
|
||||
return helpers.HASH_TX_SIGN.to_bytes(4, 'big')
|
||||
return helpers.HASH_TX_SIGN.to_bytes(4, "big")
|
||||
|
||||
|
||||
def first_half_of_sha512(b):
|
||||
@ -64,5 +65,13 @@ def set_canonical_flag(msg: RippleSignTx):
|
||||
|
||||
|
||||
def validate(msg: RippleSignTx):
|
||||
if None in (msg.fee, msg.sequence, msg.payment, msg.payment.amount, msg.payment.destination):
|
||||
raise ProcessError("Some of the required fields are missing (fee, sequence, payment.amount, payment.destination)")
|
||||
if None in (
|
||||
msg.fee,
|
||||
msg.sequence,
|
||||
msg.payment,
|
||||
msg.payment.amount,
|
||||
msg.payment.destination,
|
||||
):
|
||||
raise ProcessError(
|
||||
"Some of the required fields are missing (fee, sequence, payment.amount, payment.destination)"
|
||||
)
|
||||
|
Loading…
Reference in New Issue
Block a user