@ -5,7 +5,7 @@ from trezor.crypto import hashlib
from trezor . crypto . curve import ed25519
from trezor . enums import (
CardanoAddressType ,
Cardano Catalyst RegistrationFormat,
Cardano Governance RegistrationFormat,
CardanoTxAuxiliaryDataSupplementType ,
)
@ -18,21 +18,21 @@ from .helpers.utils import derive_public_key
if TYPE_CHECKING :
Delegations = list [ tuple [ bytes , int ] ]
Catalyst RegistrationPayload = dict [ int , Delegations | bytes | int ]
Signed CatalystRegistrationPayload = tuple [ Catalyst RegistrationPayload, bytes ]
Catalyst RegistrationSignature = dict [ int , bytes ]
Catalyst Registration = dict [
int , CatalystRegistrationPayload | Catalyst RegistrationSignature
Governance RegistrationPayload = dict [ int , Delegations | bytes | int ]
Signed GovernanceRegistrationPayload = tuple [ Governance RegistrationPayload, bytes ]
Governance RegistrationSignature = dict [ int , bytes ]
Governance Registration = dict [
int , GovernanceRegistrationPayload | Governance RegistrationSignature
]
from . import seed
AUXILIARY_DATA_HASH_SIZE = 32
CATALYST _VOTING_PUBLIC_KEY_LENGTH = 32
CATALYST _REGISTRATION_HASH_SIZE = 32
GOVERNANCE _VOTING_PUBLIC_KEY_LENGTH = 32
GOVERNANCE _REGISTRATION_HASH_SIZE = 32
METADATA_KEY_ CATALYST _REGISTRATION = 61284
METADATA_KEY_ CATALYST _REGISTRATION_SIGNATURE = 61285
METADATA_KEY_ GOVERNANCE _REGISTRATION = 61284
METADATA_KEY_ GOVERNANCE _REGISTRATION_SIGNATURE = 61285
MAX_DELEGATION_COUNT = 32
DEFAULT_VOTING_PURPOSE = 0
@ -48,10 +48,10 @@ def validate(auxiliary_data: messages.CardanoTxAuxiliaryData) -> None:
if auxiliary_data . hash :
fields_provided + = 1
_validate_hash ( auxiliary_data . hash )
if auxiliary_data . catalyst _registration_parameters:
if auxiliary_data . governance _registration_parameters:
fields_provided + = 1
_validate_ catalyst _registration_parameters(
auxiliary_data . catalyst _registration_parameters
_validate_ governance _registration_parameters(
auxiliary_data . governance _registration_parameters
)
assert_cond ( fields_provided == 1 )
@ -60,8 +60,8 @@ def _validate_hash(auxiliary_data_hash: bytes) -> None:
assert_cond ( len ( auxiliary_data_hash ) == AUXILIARY_DATA_HASH_SIZE )
def _validate_ catalyst _registration_parameters(
parameters : messages . Cardano Catalyst RegistrationParametersType,
def _validate_ governance _registration_parameters(
parameters : messages . Cardano Governance RegistrationParametersType,
) - > None :
voting_key_fields_provided = 0
if parameters . voting_public_key is not None :
@ -69,7 +69,7 @@ def _validate_catalyst_registration_parameters(
_validate_voting_public_key ( parameters . voting_public_key )
if parameters . delegations :
voting_key_fields_provided + = 1
assert_cond ( parameters . format == Cardano Catalyst RegistrationFormat. CIP36 )
assert_cond ( parameters . format == Cardano Governance RegistrationFormat. CIP36 )
_validate_delegations ( parameters . delegations )
assert_cond ( voting_key_fields_provided == 1 )
@ -80,15 +80,15 @@ def _validate_catalyst_registration_parameters(
addresses . validate_address_parameters ( address_parameters )
if parameters . voting_purpose is not None :
assert_cond ( parameters . format == Cardano Catalyst RegistrationFormat. CIP36 )
assert_cond ( parameters . format == Cardano Governance RegistrationFormat. CIP36 )
def _validate_voting_public_key ( key : bytes ) - > None :
assert_cond ( len ( key ) == CATALYST _VOTING_PUBLIC_KEY_LENGTH)
assert_cond ( len ( key ) == GOVERNANCE _VOTING_PUBLIC_KEY_LENGTH)
def _validate_delegations (
delegations : list [ messages . Cardano Catalyst Delegation] ,
delegations : list [ messages . Cardano Governance Delegation] ,
) - > None :
assert_cond ( len ( delegations ) < = MAX_DELEGATION_COUNT )
for delegation in delegations :
@ -96,9 +96,9 @@ def _validate_delegations(
def _get_voting_purpose_to_serialize (
parameters : messages . Cardano Catalyst RegistrationParametersType,
parameters : messages . Cardano Governance RegistrationParametersType,
) - > int | None :
if parameters . format == Cardano Catalyst RegistrationFormat. CIP15 :
if parameters . format == Cardano Governance RegistrationFormat. CIP15 :
return None
if parameters . voting_purpose is None :
return DEFAULT_VOTING_PURPOSE
@ -109,13 +109,13 @@ async def show(
ctx : wire . Context ,
keychain : seed . Keychain ,
auxiliary_data_hash : bytes ,
parameters : messages . Cardano Catalyst RegistrationParametersType | None ,
parameters : messages . Cardano Governance RegistrationParametersType | None ,
protocol_magic : int ,
network_id : int ,
should_show_details : bool ,
) - > None :
if parameters :
await _show_ catalyst _registration(
await _show_ governance _registration(
ctx ,
keychain ,
parameters ,
@ -128,10 +128,10 @@ async def show(
await layout . show_auxiliary_data_hash ( ctx , auxiliary_data_hash )
async def _show_ catalyst _registration(
async def _show_ governance _registration(
ctx : wire . Context ,
keychain : seed . Keychain ,
parameters : messages . Cardano Catalyst RegistrationParametersType,
parameters : messages . Cardano Governance RegistrationParametersType,
protocol_magic : int ,
network_id : int ,
should_show_details : bool ,
@ -140,7 +140,7 @@ async def _show_catalyst_registration(
encoded_public_key = bech32 . encode (
bech32 . HRP_JORMUN_PUBLIC_KEY , delegation . voting_public_key
)
await layout . confirm_ catalyst _registration_delegation(
await layout . confirm_ governance _registration_delegation(
ctx , encoded_public_key , delegation . weight
)
@ -161,7 +161,7 @@ async def _show_catalyst_registration(
_get_voting_purpose_to_serialize ( parameters ) if should_show_details else None
)
await layout . confirm_ catalyst _registration(
await layout . confirm_ governance _registration(
ctx ,
encoded_public_key ,
parameters . staking_path ,
@ -177,20 +177,20 @@ def get_hash_and_supplement(
protocol_magic : int ,
network_id : int ,
) - > tuple [ bytes , messages . CardanoTxAuxiliaryDataSupplement ] :
if parameters := auxiliary_data . catalyst _registration_parameters:
if parameters := auxiliary_data . governance _registration_parameters:
(
catalyst _registration_payload,
catalyst _signature,
) = _get_signed_ catalyst _registration_payload(
governance _registration_payload,
governance _signature,
) = _get_signed_ governance _registration_payload(
keychain , parameters , protocol_magic , network_id
)
auxiliary_data_hash = _get_ catalyst _registration_hash(
catalyst_registration_payload, catalyst _signature
auxiliary_data_hash = _get_ governance _registration_hash(
governance_registration_payload, governance _signature
)
auxiliary_data_supplement = messages . CardanoTxAuxiliaryDataSupplement (
type = CardanoTxAuxiliaryDataSupplementType . CATALYST _REGISTRATION_SIGNATURE,
type = CardanoTxAuxiliaryDataSupplementType . GOVERNANCE _REGISTRATION_SIGNATURE,
auxiliary_data_hash = auxiliary_data_hash ,
catalyst_signature= catalyst _signature,
governance_signature= governance _signature,
)
return auxiliary_data_hash , auxiliary_data_supplement
else :
@ -200,35 +200,35 @@ def get_hash_and_supplement(
)
def _get_ catalyst _registration_hash(
catalyst_registration_payload: Catalyst RegistrationPayload,
catalyst _registration_payload_signature: bytes ,
def _get_ governance _registration_hash(
governance_registration_payload: Governance RegistrationPayload,
governance _registration_payload_signature: bytes ,
) - > bytes :
cborized_ catalyst_registration = _cborize_catalyst _registration(
catalyst _registration_payload,
catalyst _registration_payload_signature,
cborized_ governance_registration = _cborize_governance _registration(
governance _registration_payload,
governance _registration_payload_signature,
)
return _get_hash ( cbor . encode ( _wrap_metadata ( cborized_ catalyst _registration) ) )
return _get_hash ( cbor . encode ( _wrap_metadata ( cborized_ governance _registration) ) )
def _cborize_ catalyst _registration(
catalyst_registration_payload: Catalyst RegistrationPayload,
catalyst _registration_payload_signature: bytes ,
) - > Catalyst Registration:
catalyst_registration_signature = { 1 : catalyst _registration_payload_signature}
def _cborize_ governance _registration(
governance_registration_payload: Governance RegistrationPayload,
governance _registration_payload_signature: bytes ,
) - > Governance Registration:
governance_registration_signature = { 1 : governance _registration_payload_signature}
return {
METADATA_KEY_ CATALYST_REGISTRATION: catalyst _registration_payload,
METADATA_KEY_ CATALYST_REGISTRATION_SIGNATURE: catalyst _registration_signature,
METADATA_KEY_ GOVERNANCE_REGISTRATION: governance _registration_payload,
METADATA_KEY_ GOVERNANCE_REGISTRATION_SIGNATURE: governance _registration_signature,
}
def _get_signed_ catalyst _registration_payload(
def _get_signed_ governance _registration_payload(
keychain : seed . Keychain ,
parameters : messages . Cardano Catalyst RegistrationParametersType,
parameters : messages . Cardano Governance RegistrationParametersType,
protocol_magic : int ,
network_id : int ,
) - > Signed Catalyst RegistrationPayload:
) - > Signed Governance RegistrationPayload:
delegations_or_key : Delegations | bytes
if len ( parameters . delegations ) > 0 :
delegations_or_key = [
@ -251,7 +251,7 @@ def _get_signed_catalyst_registration_payload(
voting_purpose = _get_voting_purpose_to_serialize ( parameters )
payload : Catalyst RegistrationPayload = {
payload : Governance RegistrationPayload = {
1 : delegations_or_key ,
2 : staking_key ,
3 : reward_address ,
@ -260,7 +260,7 @@ def _get_signed_catalyst_registration_payload(
if voting_purpose is not None :
payload [ 5 ] = voting_purpose
signature = _create_ catalyst _registration_payload_signature(
signature = _create_ governance _registration_payload_signature(
keychain ,
payload ,
parameters . staking_path ,
@ -269,24 +269,24 @@ def _get_signed_catalyst_registration_payload(
return payload , signature
def _create_ catalyst _registration_payload_signature(
def _create_ governance _registration_payload_signature(
keychain : seed . Keychain ,
catalyst_registration_payload: Catalyst RegistrationPayload,
governance_registration_payload: Governance RegistrationPayload,
path : list [ int ] ,
) - > bytes :
node = keychain . derive ( path )
encoded_ catalyst _registration = cbor . encode (
{ METADATA_KEY_ CATALYST_REGISTRATION: catalyst _registration_payload}
encoded_ governance _registration = cbor . encode (
{ METADATA_KEY_ GOVERNANCE_REGISTRATION: governance _registration_payload}
)
catalyst _registration_hash = hashlib . blake2b (
data = encoded_ catalyst _registration,
outlen = CATALYST _REGISTRATION_HASH_SIZE,
governance _registration_hash = hashlib . blake2b (
data = encoded_ governance _registration,
outlen = GOVERNANCE _REGISTRATION_HASH_SIZE,
) . digest ( )
return ed25519 . sign_ext (
node . private_key ( ) , node . private_key_ext ( ) , catalyst _registration_hash
node . private_key ( ) , node . private_key_ext ( ) , governance _registration_hash
)