You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
trezor-firmware/core/src/apps/ontology/serialize.py

96 lines
3.2 KiB

from trezor.messages import OntologyAsset
from trezor.messages.OntologyOntIdAddAttributes import OntologyOntIdAddAttributes
from trezor.messages.OntologyOntIdRegister import OntologyOntIdRegister
from trezor.messages.OntologyTransaction import OntologyTransaction
from trezor.messages.OntologyTransfer import OntologyTransfer
from trezor.messages.OntologyTxAttribute import OntologyTxAttribute
from trezor.messages.OntologyWithdrawOng import OntologyWithdrawOng
from . import const as Const, writer
from .helpers import get_bytes_from_address
from .sc.native_builder import ParamStruct, build_native_call
def serialize_tx(tx: OntologyTransaction, payload: bytes, hw) -> None:
writer.write_byte(hw, tx.version)
writer.write_byte(hw, Const.TRANSACTION_TYPE)
writer.write_uint32(hw, tx.nonce)
writer.write_uint64(hw, tx.gas_price)
writer.write_uint64(hw, tx.gas_limit)
payer = get_bytes_from_address(tx.payer)
writer.write_bytes(hw, payer)
writer.write_bytes_with_length(hw, payload)
attributes = tx.tx_attributes
writer.write_varint(hw, len(attributes))
if attributes is not None:
for attribute in attributes:
_serialize_tx_attribute(hw, attribute)
def serialize_transfer(transfer: OntologyTransfer) -> bytes:
from_address = get_bytes_from_address(transfer.from_address)
to_address = get_bytes_from_address(transfer.to_address)
amount = transfer.amount
contract = ""
if transfer.asset == OntologyAsset.ONT:
contract = Const.ONT_CONTRACT
else:
contract = Const.ONG_CONTRACT
struct = ParamStruct([from_address, to_address, amount])
native_call = build_native_call("transfer", [[struct]], contract)
return native_call
def serialize_withdraw_ong(withdraw_ong: OntologyWithdrawOng) -> bytes:
from_address = get_bytes_from_address(withdraw_ong.from_address)
to_address = get_bytes_from_address(withdraw_ong.to_address)
amount = withdraw_ong.amount
struct = ParamStruct([from_address, Const.ONT_CONTRACT, to_address, amount])
native_call = build_native_call("transferFrom", [struct], Const.ONG_CONTRACT)
return native_call
def serialize_ont_id_register(register: OntologyOntIdRegister) -> bytes:
ont_id = register.ont_id.encode()
struct = ParamStruct([ont_id, register.public_key])
native_call = build_native_call(
"regIDWithPublicKey", [struct], Const.ONTID_CONTRACT
)
return native_call
def serialize_ont_id_add_attributes(add: OntologyOntIdAddAttributes) -> bytes:
ont_id = add.ont_id.encode()
attributes = add.ont_id_attributes
arguments = [ont_id, len(attributes)]
for attribute in attributes:
arguments.append(attribute.key.encode())
arguments.append(attribute.type.encode())
arguments.append(attribute.value.encode())
arguments.append(add.public_key)
struct = ParamStruct(arguments)
native_call = build_native_call("addAttributes", [struct], Const.ONTID_CONTRACT)
return native_call
def _serialize_tx_attribute(ret: bytearray, attribute: OntologyTxAttribute) -> None:
writer.write_byte(ret, attribute.usage)
if attribute.data is not None:
writer.write_bytes_with_length(ret, attribute.data)