Skip to content
Merged
8 changes: 7 additions & 1 deletion crypto/identity/private_key.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
from binascii import hexlify
from hashlib import sha256
from coincurve import PrivateKey as PvtKey
from Cryptodome.Hash import keccak

from crypto.enums.constants import Constants

def keccak256(data: bytes) -> bytes:
"""Keccak256 hash function"""

return bytes.fromhex(keccak.new(data=data, digest_bits=256).hexdigest())

class PrivateKey(object):
def __init__(self, private_key: str):
self.private_key = PvtKey.from_hex(private_key)
Expand Down Expand Up @@ -31,7 +37,7 @@ def sign_compact(self, message: bytes) -> bytes:
Returns:
bytes: signature of the signed message
"""
der = self.private_key.sign_recoverable(message)
der = self.private_key.sign_recoverable(message, hasher=keccak256)

return bytes([der[64] + Constants.ETHEREUM_RECOVERY_ID_OFFSET.value]) + der[0:64]

Expand Down
7 changes: 5 additions & 2 deletions crypto/transactions/builder/evm_call_builder.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
from crypto.transactions.builder.base import AbstractTransactionBuilder
from crypto.transactions.types.evm_call import EvmCall
from crypto.utils.transaction_utils import TransactionUtils

class EvmCallBuilder(AbstractTransactionBuilder):
def payload(self, payload: str):
payload = payload.lstrip('0x') # Remove '0x' prefix if present
payload = TransactionUtils.parse_hex_from_str(payload) # Remove '0x' prefix if present

self.transaction.data['data'] = payload

return self

def get_transaction_instance(self, data: dict):
return EvmCall(data)
return EvmCall(data)
49 changes: 31 additions & 18 deletions crypto/transactions/deserializer.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import re
from binascii import unhexlify
from typing import Optional
from crypto.enums.constants import Constants
from crypto.enums.contract_abi_type import ContractAbiType
from crypto.transactions.types.abstract_transaction import AbstractTransaction
from crypto.transactions.types.transfer import Transfer
from crypto.transactions.types.evm_call import EvmCall
from crypto.transactions.types.username_registration import UsernameRegistration
from crypto.transactions.types.username_resignation import UsernameResignation
from crypto.transactions.types.vote import Vote
from crypto.transactions.types.unvote import Unvote
from crypto.transactions.types.validator_registration import ValidatorRegistration
Expand All @@ -13,6 +15,7 @@
from crypto.enums.abi_function import AbiFunction
from crypto.utils.abi_decoder import AbiDecoder
from crypto.utils.rlp_decoder import RlpDecoder
from crypto.utils.transaction_utils import TransactionUtils

class Deserializer:
SIGNATURE_SIZE = 64
Expand Down Expand Up @@ -59,30 +62,40 @@ def guess_transaction_from_data(self, data: dict) -> AbstractTransaction:
if data['value'] != '0':
return Transfer(data)

payload_data = self.decode_payload(data)
consensus_payload_data = self.decode_payload(data)
if consensus_payload_data is not None:
function_name = consensus_payload_data.get('functionName')
if function_name == AbiFunction.VOTE.value:
return Vote(data)

if payload_data is None:
return EvmCall(data)
if function_name == AbiFunction.UNVOTE.value:
return Unvote(data)

function_name = payload_data.get('functionName')
if function_name == AbiFunction.VOTE.value:
return Vote(data)
elif function_name == AbiFunction.UNVOTE.value:
return Unvote(data)
elif function_name == AbiFunction.VALIDATOR_REGISTRATION.value:
return ValidatorRegistration(data)
elif function_name == AbiFunction.VALIDATOR_RESIGNATION.value:
return ValidatorResignation(data)
else:
return EvmCall(data)
if function_name == AbiFunction.VALIDATOR_REGISTRATION.value:
return ValidatorRegistration(data)

def decode_payload(self, data: dict) -> Optional[dict]:
if function_name == AbiFunction.VALIDATOR_RESIGNATION.value:
return ValidatorResignation(data)

username_payload_data = self.decode_payload(data, ContractAbiType.USERNAMES)
if username_payload_data is not None:
function_name = username_payload_data.get('functionName')
if function_name == AbiFunction.USERNAME_REGISTRATION.value:
return UsernameRegistration(data)

if function_name == AbiFunction.USERNAME_RESIGNATION.value:
return UsernameResignation(data)

return EvmCall(data)

@staticmethod
def decode_payload(data: dict, abi_type: ContractAbiType = ContractAbiType.CONSENSUS) -> Optional[dict]:
payload = data.get('data', '')

if payload == '':
return None

decoder = AbiDecoder()
decoder = AbiDecoder(abi_type)
try:
return decoder.decode_function_data(payload)
except Exception as e:
Expand All @@ -100,7 +113,7 @@ def parse_big_number(value: str) -> str:

@staticmethod
def parse_hex(value: str) -> str:
return re.sub(r'^0x', '', value)
return TransactionUtils.parse_hex_from_str(value)

@staticmethod
def parse_address(value: str) -> Optional[str]:
Expand Down
234 changes: 0 additions & 234 deletions crypto/transactions/transaction.py

This file was deleted.

Loading