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