mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-01-15 18:00:59 +00:00
nem: correct mosaic quantities
This commit is contained in:
parent
616d117648
commit
0093d21bb6
@ -22,6 +22,7 @@ AES_BLOCK_SIZE = const(16)
|
|||||||
NEM_HASH_ALG = 'keccak'
|
NEM_HASH_ALG = 'keccak'
|
||||||
NEM_PUBLIC_KEY_SIZE = const(32) # ed25519 public key
|
NEM_PUBLIC_KEY_SIZE = const(32) # ed25519 public key
|
||||||
NEM_LEVY_PERCENTILE_DIVISOR_ABSOLUTE = const(10000)
|
NEM_LEVY_PERCENTILE_DIVISOR_ABSOLUTE = const(10000)
|
||||||
|
NEM_MOSAIC_AMOUNT_DIVISOR = const(1000000)
|
||||||
|
|
||||||
NEM_MAX_PLAIN_PAYLOAD_SIZE = const(1024)
|
NEM_MAX_PLAIN_PAYLOAD_SIZE = const(1024)
|
||||||
NEM_MAX_ENCRYPTED_PAYLOAD_SIZE = const(960)
|
NEM_MAX_ENCRYPTED_PAYLOAD_SIZE = const(960)
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
# todo move to common and generate via script
|
# todo move to common and generate via script
|
||||||
|
|
||||||
|
|
||||||
def get_mosaic_definition(namespace_name: str, mosaic_name: str, network: int):
|
def get_mosaic_definition(namespace_name: str, mosaic_name: str, network: int):
|
||||||
for m in mosaics:
|
for m in mosaics:
|
||||||
if namespace_name == m["namespace"] and mosaic_name == m["mosaic"]:
|
if namespace_name == m["namespace"] and mosaic_name == m["mosaic"]:
|
||||||
@ -8,6 +9,12 @@ def get_mosaic_definition(namespace_name: str, mosaic_name: str, network: int):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def is_nem_xem_mosaic(namespace_name: str, mosaic_name: str):
|
||||||
|
if namespace_name == "nem" and mosaic_name == "xem":
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
mosaics = [
|
mosaics = [
|
||||||
{
|
{
|
||||||
"name": "XEM",
|
"name": "XEM",
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
from apps.nem.layout import *
|
from apps.nem.layout import *
|
||||||
|
from apps.nem.mosaic.definitions import *
|
||||||
from trezor.messages import NEMImportanceTransferMode
|
from trezor.messages import NEMImportanceTransferMode
|
||||||
from trezor.messages import NEMTransfer
|
from trezor.messages import NEMTransfer
|
||||||
from trezor.messages import NEMImportanceTransfer
|
from trezor.messages import NEMImportanceTransfer
|
||||||
from trezor.messages import NEMTransactionCommon
|
from trezor.messages import NEMTransactionCommon
|
||||||
from trezor.messages import NEMMosaic
|
from trezor.messages import NEMMosaic
|
||||||
from trezor.messages import NEMMosaicLevy
|
from trezor.messages import NEMMosaicLevy
|
||||||
from apps.nem.mosaic.definitions import get_mosaic_definition
|
|
||||||
|
|
||||||
|
|
||||||
async def ask_transfer(ctx, common: NEMTransactionCommon, transfer: NEMTransfer, payload, encrypted):
|
async def ask_transfer(ctx, common: NEMTransactionCommon, transfer: NEMTransfer, payload, encrypted):
|
||||||
@ -13,27 +13,31 @@ async def ask_transfer(ctx, common: NEMTransactionCommon, transfer: NEMTransfer,
|
|||||||
await _require_confirm_payload(ctx, transfer.payload, encrypted)
|
await _require_confirm_payload(ctx, transfer.payload, encrypted)
|
||||||
|
|
||||||
for mosaic in transfer.mosaics:
|
for mosaic in transfer.mosaics:
|
||||||
await ask_transfer_mosaic(ctx, mosaic, common.network)
|
await ask_transfer_mosaic(ctx, common, transfer, mosaic)
|
||||||
|
|
||||||
await _require_confirm_transfer(ctx, transfer.recipient, transfer.amount)
|
await _require_confirm_transfer(ctx, transfer.recipient, _get_xem_amount(transfer))
|
||||||
|
|
||||||
await require_confirm_final(ctx, common.fee)
|
await require_confirm_final(ctx, common.fee)
|
||||||
|
|
||||||
|
|
||||||
async def ask_transfer_mosaic(ctx, mosaic: NEMMosaic, network: int):
|
async def ask_transfer_mosaic(ctx, common: NEMTransactionCommon, transfer: NEMTransfer, mosaic: NEMMosaic):
|
||||||
definition = get_mosaic_definition(mosaic.namespace, mosaic.mosaic, network)
|
if is_nem_xem_mosaic(mosaic.namespace, mosaic.mosaic):
|
||||||
|
return
|
||||||
|
|
||||||
|
definition = get_mosaic_definition(mosaic.namespace, mosaic.mosaic, common.network)
|
||||||
|
mosaic_quantity = mosaic.quantity * transfer.amount / NEM_MOSAIC_AMOUNT_DIVISOR
|
||||||
|
|
||||||
if definition:
|
if definition:
|
||||||
msg = Text('Confirm mosaic', ui.ICON_SEND,
|
msg = Text('Confirm mosaic', ui.ICON_SEND,
|
||||||
ui.NORMAL, 'Confirm transfer of',
|
ui.NORMAL, 'Confirm transfer of',
|
||||||
ui.BOLD, format_amount(mosaic.quantity, definition["divisibility"]) + definition["ticker"],
|
ui.BOLD, format_amount(mosaic_quantity, definition["divisibility"]) + definition["ticker"],
|
||||||
ui.NORMAL, 'of',
|
ui.NORMAL, 'of',
|
||||||
ui.BOLD, definition["name"],
|
ui.BOLD, definition["name"],
|
||||||
icon_color=ui.GREEN)
|
icon_color=ui.GREEN)
|
||||||
await require_confirm(ctx, msg, ButtonRequestType.ConfirmOutput)
|
await require_confirm(ctx, msg, ButtonRequestType.ConfirmOutput)
|
||||||
|
|
||||||
if "levy" in definition and "fee" in definition:
|
if "levy" in definition and "fee" in definition:
|
||||||
levy_msg = _get_levy_msg(definition, mosaic.quantity, network)
|
levy_msg = _get_levy_msg(definition, mosaic.quantity, common.network)
|
||||||
msg = Text('Confirm mosaic', ui.ICON_SEND,
|
msg = Text('Confirm mosaic', ui.ICON_SEND,
|
||||||
ui.NORMAL, 'Confirm mosaic',
|
ui.NORMAL, 'Confirm mosaic',
|
||||||
ui.NORMAL, 'levy fee of',
|
ui.NORMAL, 'levy fee of',
|
||||||
@ -50,13 +54,25 @@ async def ask_transfer_mosaic(ctx, mosaic: NEMMosaic, network: int):
|
|||||||
|
|
||||||
msg = Text('Confirm mosaic', ui.ICON_SEND,
|
msg = Text('Confirm mosaic', ui.ICON_SEND,
|
||||||
ui.NORMAL, 'Confirm transfer of',
|
ui.NORMAL, 'Confirm transfer of',
|
||||||
ui.BOLD, str(mosaic.quantity) + ' raw units',
|
ui.BOLD, str(mosaic_quantity) + ' raw units',
|
||||||
ui.NORMAL, 'of',
|
ui.NORMAL, 'of',
|
||||||
ui.BOLD, mosaic.namespace + '.' + mosaic.mosaic,
|
ui.BOLD, mosaic.namespace + '.' + mosaic.mosaic,
|
||||||
icon_color=ui.GREEN)
|
icon_color=ui.GREEN)
|
||||||
await require_confirm(ctx, msg, ButtonRequestType.ConfirmOutput)
|
await require_confirm(ctx, msg, ButtonRequestType.ConfirmOutput)
|
||||||
|
|
||||||
|
|
||||||
|
def _get_xem_amount(transfer: NEMTransfer):
|
||||||
|
# mosaics are empty the transfer.amount denotes the xem amount
|
||||||
|
if not len(mosaics):
|
||||||
|
return transfer.amount
|
||||||
|
# otherwise xem amount is taken from the nem xem mosaic if present
|
||||||
|
for mosaic in transfer.mosaics:
|
||||||
|
if is_nem_xem_mosaic(mosaic.namespace, mosaic.mosaic):
|
||||||
|
return mosaic.quantity * transfer.amount / NEM_MOSAIC_AMOUNT_DIVISOR
|
||||||
|
# if there are mosaics but do not include xem, 0 xem is sent
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
def _get_levy_msg(mosaic_definition, quantity: int, network: int) -> str:
|
def _get_levy_msg(mosaic_definition, quantity: int, network: int) -> str:
|
||||||
levy_definition = get_mosaic_definition(mosaic_definition["levy_namespace"], mosaic_definition["levy_mosaic"], network)
|
levy_definition = get_mosaic_definition(mosaic_definition["levy_namespace"], mosaic_definition["levy_mosaic"], network)
|
||||||
if mosaic_definition["levy"] == NEMMosaicLevy.MosaicLevy_Absolute:
|
if mosaic_definition["levy"] == NEMMosaicLevy.MosaicLevy_Absolute:
|
||||||
|
Loading…
Reference in New Issue
Block a user