from micropython import const from trezor import ui from trezor.messages import (NEMMosaicCreation, NEMMosaicDefinition, NEMMosaicLevy, NEMMosaicSupplyChange, NEMSupplyChangeType, NEMTransactionCommon) from trezor.ui.confirm import ConfirmDialog from trezor.ui.scroll import Scrollpage, animate_swipe, paginate from trezor.ui.text import Text from trezor.utils import split_words from ..layout import (require_confirm_content, require_confirm_fee, require_confirm_final, require_confirm_text, split_address, trim) async def ask_mosaic_creation(ctx, common: NEMTransactionCommon, creation: NEMMosaicCreation): await require_confirm_content(ctx, 'Create mosaic', _creation_message(creation)) await _require_confirm_properties(ctx, creation.definition) await require_confirm_fee(ctx, 'Confirm creation fee', creation.fee) await require_confirm_final(ctx, common.fee) async def ask_supply_change(ctx, common: NEMTransactionCommon, change: NEMMosaicSupplyChange): await require_confirm_content(ctx, 'Supply change', _supply_message(change)) if change.type == NEMSupplyChangeType.SupplyChange_Decrease: msg = 'Decrease supply by ' + str(change.delta) + ' whole units?' elif change.type == NEMSupplyChangeType.SupplyChange_Increase: msg = 'Increase supply by ' + str(change.delta) + ' whole units?' else: raise ValueError('Invalid supply change type') await require_confirm_text(ctx, msg) await require_confirm_final(ctx, common.fee) def _creation_message(mosaic_creation): return [ui.NORMAL, 'Create mosaic', ui.BOLD, mosaic_creation.definition.mosaic, ui.NORMAL, 'under namespace', ui.BOLD, mosaic_creation.definition.namespace] def _supply_message(supply_change): return [ui.NORMAL, 'Modify supply for', ui.BOLD, supply_change.mosaic, ui.NORMAL, 'under namespace', ui.BOLD, supply_change.namespace] async def _require_confirm_properties(ctx, definition: NEMMosaicDefinition): properties = _get_mosaic_properties(definition) first_page = const(0) paginator = paginate(_show_page, len(properties), first_page, properties) await ctx.wait(paginator) @ui.layout async def _show_page(page: int, page_count: int, content): content = Scrollpage(content[page], page, page_count) if page + 1 == page_count: await ConfirmDialog(content) else: content.render() await animate_swipe() def _get_mosaic_properties(definition: NEMMosaicDefinition): properties = [] # description if definition.description: t = Text('Confirm properties', ui.ICON_SEND) t.bold('Description:') t.type(*split_words(trim(definition.description, 70), 22)) properties.append(t) # transferable if definition.transferable: transferable = 'Yes' else: transferable = 'No' t = Text('Confirm properties', ui.ICON_SEND) t.bold('Transferable?') t.type(transferable) properties.append(t) # mutable_supply if definition.mutable_supply: imm = 'mutable' else: imm = 'immutable' if definition.supply: t = Text('Confirm properties', ui.ICON_SEND) t.bold('Initial supply:') t.type(str(definition.supply), imm) else: t = Text('Confirm properties', ui.ICON_SEND) t.bold('Initial supply:') t.type(imm) properties.append(t) # levy if definition.levy: t = Text('Confirm properties', ui.ICON_SEND) t.bold('Levy recipient:') t.mono(*split_address(definition.levy_address)) properties.append(t) t = Text('Confirm properties', ui.ICON_SEND) t.bold('Levy fee:') t.type(str(definition.fee)) t.bold('Levy divisibility:') t.type(str(definition.divisibility)) properties.append(t) t = Text('Confirm properties', ui.ICON_SEND) t.bold('Levy namespace:') t.type(definition.levy_namespace) t.bold('Levy mosaic:') t.type(definition.levy_mosaic) properties.append(t) if definition.levy == NEMMosaicLevy.MosaicLevy_Absolute: levy_type = 'absolute' else: levy_type = 'percentile' t = Text('Confirm properties', ui.ICON_SEND) t.bold('Levy type:') t.type(levy_type) properties.append(t) return properties