From cadc159796d4c0addc36e9992286be677db71fcd Mon Sep 17 00:00:00 2001 From: AndreaScorza Date: Mon, 21 Mar 2022 14:45:35 +0100 Subject: [PATCH] Burn transaction --- src/lto/transactions/__init__.py | 3 ++ src/lto/transactions/burn.py | 71 ++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/lto/transactions/burn.py diff --git a/src/lto/transactions/__init__.py b/src/lto/transactions/__init__.py index 4383b86..afea138 100644 --- a/src/lto/transactions/__init__.py +++ b/src/lto/transactions/__init__.py @@ -10,6 +10,7 @@ from lto.transactions.transfer import Transfer from lto.transactions.register import Register from lto.transactions.data import Data +from lto.transactions.burn import Burn def from_data(data): if data['type'] == 4: @@ -36,5 +37,7 @@ def from_data(data): return CancelSponsorship.from_data(data) elif data['type'] == 20: return Register.from_data(data) + elif data['type'] == 21: + return Burn.from_data(data) else: raise Exception('Incorrect transaction Type') diff --git a/src/lto/transactions/burn.py b/src/lto/transactions/burn.py new file mode 100644 index 0000000..b935fcd --- /dev/null +++ b/src/lto/transactions/burn.py @@ -0,0 +1,71 @@ +import base58 +import struct +from lto import crypto +from lto.transaction import Transaction + + +class Burn(Transaction): + TYPE = 15 + DEFAULT_FEE = 100000000 + DEFAULT_VERSION = 3 + + def __init__(self, amount): + super().__init__() + if amount < 1: + raise Exception("Minimum burn amount = 1") + self.amount = amount + self.version = self.DEFAULT_VERSION + self.tx_fee = self.DEFAULT_FEE + + def __to_binary_v3(self): + return (self.TYPE.to_bytes(1, 'big') + + b'\3' + + crypto.str2bytes(self.chain_id) + + struct.pack(">Q", self.timestamp) + + crypto.key_type_id(self.sender_key_type) + + base58.b58decode(self.sender_public_key) + + struct.pack(">Q", self.tx_fee) + + struct.pack(">Q", self.amount)) + + def to_binary(self): + if self.version == 3: + return self.__to_binary_v3() + else: + raise Exception('Incorrect Version') + + def to_json(self): + return (crypto.merge_dicts({ + "type": self.TYPE, + "version": self.version, + "id": self.id if self.id else "", + "sender": self.sender, + "senderKeyType": self.sender_key_type, + "senderPublicKey": self.sender_public_key, + "fee": self.tx_fee, + "timestamp": self.timestamp, + "amount": self.amount, + "proofs": self.proofs, + "height": self.height if self.height else "" + }, self._sponsor_json())) + + @staticmethod + def from_data(data): + tx = Burn(data['amount']) + tx.type = data['type'] + tx.version = data['version'] + tx.id = data['id'] if 'id' in data else '' + tx.sender = data['sender'] if 'sender' in data else '' + tx.sender_key_type = data['senderKeyType'] if 'senderKeyType' in data else 'ed25519' + tx.sender_public_key = data['senderPublicKey'] + tx.fee = data['fee'] + tx.timestamp = data['timestamp'] + tx.amount = data['amount'] + tx.proofs = data['proofs'] if 'proofs' in data else [] + tx.height = data['height'] if 'height' in data else '' + + if "sponsor_public_key" in data: + tx.sponsor = data['sponsor'] + tx.sponsor_public_key = data['sponsorPublicKey'] + tx.sponsor_key_type = data['sponsorKeyType'] + + return tx