diff --git a/common/protob/messages-mintlayer.proto b/common/protob/messages-mintlayer.proto index 61f997172..143357e5c 100644 --- a/common/protob/messages-mintlayer.proto +++ b/common/protob/messages-mintlayer.proto @@ -186,16 +186,17 @@ message MintlayerAccountTxInput { * @embed */ message MintlayerAccountCommandTxInput { - repeated MintlayerAddressPath address_n = 1; // BIP-32 path to derive the key from master node - required string address = 2; // destination address in Base58 encoding; script_type must be PAYTOADDRESS - optional uint32 sequence = 3 [default=0xffffffff]; // sequence - required uint64 nonce = 4; // incrementing account nonce - optional MintlayerMintTokens mint = 5; // mint tokens - optional MintlayerUnmintTokens unmint = 6; // unmint tokens - optional MintlayerLockTokenSupply lock_token_supply = 7; // lock token supply - optional MintlayerFreezeToken freeze_token = 8; // freeze supply - optional MintlayerUnfreezeToken unfreeze_token = 9; // unfreeze supply - optional MintlayerChangeTokenAuhtority change_token_authority = 10; // change token authority + repeated MintlayerAddressPath address_n = 1; // BIP-32 path to derive the key from master node + required string address = 2; // destination address in Base58 encoding; script_type must be PAYTOADDRESS + optional uint32 sequence = 3 [default=0xffffffff]; // sequence + required uint64 nonce = 4; // incrementing account nonce + optional MintlayerMintTokens mint = 5; // mint tokens + optional MintlayerUnmintTokens unmint = 6; // unmint tokens + optional MintlayerLockTokenSupply lock_token_supply = 7; // lock token supply + optional MintlayerFreezeToken freeze_token = 8; // freeze supply + optional MintlayerUnfreezeToken unfreeze_token = 9; // unfreeze supply + optional MintlayerChangeTokenAuhtority change_token_authority = 10; // change token authority + optional MintlayerChangeTokenMetadataUri change_token_metadata_uri = 11; // change token metadata uri } /** Data type for output value coins or token @@ -243,6 +244,14 @@ message MintlayerChangeTokenAuhtority { required string destination = 2; // destination for the new authority } +/** Data type for output value coins or token + * @embed + */ +message MintlayerChangeTokenMetadataUri { + required bytes token_id = 1; // token id + required bytes metadata_uri = 2; // new metadata uri +} + /** Data type for transaction output to be signed. * @embed */ diff --git a/core/embed/rust/src/mintlayer/mod.rs b/core/embed/rust/src/mintlayer/mod.rs index c16aeab1f..6518b2e07 100644 --- a/core/embed/rust/src/mintlayer/mod.rs +++ b/core/embed/rust/src/mintlayer/mod.rs @@ -164,6 +164,9 @@ extern "C" fn mintlayer_encode_account_command_input( }; AccountCommand::ChangeTokenAuthority(token_id, destination) } + 7 => { + AccountCommand::ChangeTokenMetadataUri(token_id, data.to_vec()) + } _ => return MintlayerErrorCode::InvalidAccountCommand.into(), }; @@ -1324,29 +1327,39 @@ enum IsTokenUnfreezable { Yes, } +type OrderId = H256; +type TokenId = H256; + #[derive(Encode)] enum AccountCommand { // Create certain amount of tokens and add them to circulating supply #[codec(index = 0)] - MintTokens(H256, Amount), + MintTokens(TokenId, Amount), // Take tokens out of circulation. Not the same as Burn because unminting means that certain // amount of tokens is no longer supported by underlying fiat currency, which can only be // done by the authority. #[codec(index = 1)] - UnmintTokens(H256), + UnmintTokens(TokenId), // After supply is locked tokens cannot be minted or unminted ever again. // Works only for Lockable tokens supply. #[codec(index = 2)] - LockTokenSupply(H256), + LockTokenSupply(TokenId), // Freezing token forbids any operation with all the tokens (except for optional unfreeze) #[codec(index = 3)] - FreezeToken(H256, IsTokenUnfreezable), + FreezeToken(TokenId, IsTokenUnfreezable), // By unfreezing token all operations are available for the tokens again #[codec(index = 4)] - UnfreezeToken(H256), + UnfreezeToken(TokenId), // Change the authority who can authorize operations for a token #[codec(index = 5)] - ChangeTokenAuthority(H256, Destination), + ChangeTokenAuthority(TokenId, Destination), + #[codec(index = 6)] + ConcludeOrder(OrderId), + #[codec(index = 7)] + FillOrder(OrderId, OutputValue, Destination), + // Change token metadata uri + #[codec(index = 8)] + ChangeTokenMetadataUri(TokenId, parity_scale_codec::alloc::vec::Vec), } #[derive(Encode)] diff --git a/core/src/apps/mintlayer/get_address.py b/core/src/apps/mintlayer/get_address.py index 114f22c79..7a66b770a 100644 --- a/core/src/apps/mintlayer/get_address.py +++ b/core/src/apps/mintlayer/get_address.py @@ -16,21 +16,21 @@ async def get_address(msg: MintlayerGetAddress, keychain: Keychain) -> Mintlayer from apps.common import paths - from .helpers import address_from_public_key + from trezor.crypto.bech32 import bech32_encode, Encoding - HRP = "bnb" + HRP = "mtc" address_n = msg.address_n # local_cache_attribute await paths.validate_path(keychain, address_n) node = keychain.derive(address_n) pubkey = node.public_key() - address = address_from_public_key(pubkey, HRP) + address = bech32_encode(HRP, pubkey, Encoding.BECH32M) if msg.show_display: await show_address( address, path=paths.address_n_to_str(address_n), - account=paths.get_account_name("BNB", address_n, PATTERNS[0], SLIP44_ID), + account=None, chunkify=bool(msg.chunkify), ) diff --git a/core/src/apps/mintlayer/sign_tx/helpers.py b/core/src/apps/mintlayer/sign_tx/helpers.py index 56c81f9f3..215545c9e 100644 --- a/core/src/apps/mintlayer/sign_tx/helpers.py +++ b/core/src/apps/mintlayer/sign_tx/helpers.py @@ -454,6 +454,7 @@ def _sanitize_tx_input(txi: MintlayerTxInput) -> MintlayerTxInput: and cmd.freeze_token is None and cmd.unfreeze_token is None and cmd.lock_token_supply is None + and cmd.change_token_metadata_uri is None and cmd.change_token_authority is None) if no_cmd: raise DataError("No account command present") diff --git a/core/src/apps/mintlayer/sign_tx/signer.py b/core/src/apps/mintlayer/sign_tx/signer.py index 9434f0159..041bb2e47 100644 --- a/core/src/apps/mintlayer/sign_tx/signer.py +++ b/core/src/apps/mintlayer/sign_tx/signer.py @@ -259,6 +259,10 @@ async def step4_serialize_inputs(self) -> Tuple[List[bytes], List[bytes]]: command = 5 token_id = x.change_token_authority.token_id data = mintlayer_decode_address_to_bytes(x.change_token_authority.destination) + elif x.change_token_metadata_uri: + command = 5 + token_id = x.change_token_metadata_uri.token_id + data = x.change_token_metadata_uri.metadata_uri else: raise Exception("unknown account command") diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py index ead726d3a..bf2b7ca3e 100644 --- a/core/src/trezor/messages.py +++ b/core/src/trezor/messages.py @@ -4215,6 +4215,7 @@ class MintlayerAccountCommandTxInput(protobuf.MessageType): freeze_token: "MintlayerFreezeToken | None" unfreeze_token: "MintlayerUnfreezeToken | None" change_token_authority: "MintlayerChangeTokenAuhtority | None" + change_token_metadata_uri: "MintlayerChangeTokenMetadataUri | None" def __init__( self, @@ -4229,6 +4230,7 @@ def __init__( freeze_token: "MintlayerFreezeToken | None" = None, unfreeze_token: "MintlayerUnfreezeToken | None" = None, change_token_authority: "MintlayerChangeTokenAuhtority | None" = None, + change_token_metadata_uri: "MintlayerChangeTokenMetadataUri | None" = None, ) -> None: pass @@ -4326,6 +4328,22 @@ def __init__( def is_type_of(cls, msg: Any) -> TypeGuard["MintlayerChangeTokenAuhtority"]: return isinstance(msg, cls) + class MintlayerChangeTokenMetadataUri(protobuf.MessageType): + token_id: "bytes" + metadata_uri: "bytes" + + def __init__( + self, + *, + token_id: "bytes", + metadata_uri: "bytes", + ) -> None: + pass + + @classmethod + def is_type_of(cls, msg: Any) -> TypeGuard["MintlayerChangeTokenMetadataUri"]: + return isinstance(msg, cls) + class MintlayerTxOutput(protobuf.MessageType): transfer: "MintlayerTransferTxOutput | None" lock_then_transfer: "MintlayerLockThenTransferTxOutput | None" diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py index 1c40b2cb1..11b8cd377 100644 --- a/python/src/trezorlib/messages.py +++ b/python/src/trezorlib/messages.py @@ -5578,6 +5578,7 @@ class MintlayerAccountCommandTxInput(protobuf.MessageType): 8: protobuf.Field("freeze_token", "MintlayerFreezeToken", repeated=False, required=False, default=None), 9: protobuf.Field("unfreeze_token", "MintlayerUnfreezeToken", repeated=False, required=False, default=None), 10: protobuf.Field("change_token_authority", "MintlayerChangeTokenAuhtority", repeated=False, required=False, default=None), + 11: protobuf.Field("change_token_metadata_uri", "MintlayerChangeTokenMetadataUri", repeated=False, required=False, default=None), } def __init__( @@ -5593,6 +5594,7 @@ def __init__( freeze_token: Optional["MintlayerFreezeToken"] = None, unfreeze_token: Optional["MintlayerUnfreezeToken"] = None, change_token_authority: Optional["MintlayerChangeTokenAuhtority"] = None, + change_token_metadata_uri: Optional["MintlayerChangeTokenMetadataUri"] = None, ) -> None: self.address_n: Sequence["MintlayerAddressPath"] = address_n if address_n is not None else [] self.address = address @@ -5604,6 +5606,7 @@ def __init__( self.freeze_token = freeze_token self.unfreeze_token = unfreeze_token self.change_token_authority = change_token_authority + self.change_token_metadata_uri = change_token_metadata_uri class MintlayerMintTokens(protobuf.MessageType): @@ -5699,6 +5702,23 @@ def __init__( self.destination = destination +class MintlayerChangeTokenMetadataUri(protobuf.MessageType): + MESSAGE_WIRE_TYPE = None + FIELDS = { + 1: protobuf.Field("token_id", "bytes", repeated=False, required=True), + 2: protobuf.Field("metadata_uri", "bytes", repeated=False, required=True), + } + + def __init__( + self, + *, + token_id: "bytes", + metadata_uri: "bytes", + ) -> None: + self.token_id = token_id + self.metadata_uri = metadata_uri + + class MintlayerTxOutput(protobuf.MessageType): MESSAGE_WIRE_TYPE = None FIELDS = { diff --git a/rust/trezor-client/src/protos/generated/messages_mintlayer.rs b/rust/trezor-client/src/protos/generated/messages_mintlayer.rs index 11c9b4a42..60f7a501b 100644 --- a/rust/trezor-client/src/protos/generated/messages_mintlayer.rs +++ b/rust/trezor-client/src/protos/generated/messages_mintlayer.rs @@ -3275,6 +3275,8 @@ pub struct MintlayerAccountCommandTxInput { pub unfreeze_token: ::protobuf::MessageField, // @@protoc_insertion_point(field:hw.trezor.messages.mintlayer.MintlayerAccountCommandTxInput.change_token_authority) pub change_token_authority: ::protobuf::MessageField, + // @@protoc_insertion_point(field:hw.trezor.messages.mintlayer.MintlayerAccountCommandTxInput.change_token_metadata_uri) + pub change_token_metadata_uri: ::protobuf::MessageField, // special fields // @@protoc_insertion_point(special_field:hw.trezor.messages.mintlayer.MintlayerAccountCommandTxInput.special_fields) pub special_fields: ::protobuf::SpecialFields, @@ -3366,7 +3368,7 @@ impl MintlayerAccountCommandTxInput { } fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { - let mut fields = ::std::vec::Vec::with_capacity(10); + let mut fields = ::std::vec::Vec::with_capacity(11); let mut oneofs = ::std::vec::Vec::with_capacity(0); fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>( "address_n", @@ -3418,6 +3420,11 @@ impl MintlayerAccountCommandTxInput { |m: &MintlayerAccountCommandTxInput| { &m.change_token_authority }, |m: &mut MintlayerAccountCommandTxInput| { &mut m.change_token_authority }, )); + fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, MintlayerChangeTokenMetadataUri>( + "change_token_metadata_uri", + |m: &MintlayerAccountCommandTxInput| { &m.change_token_metadata_uri }, + |m: &mut MintlayerAccountCommandTxInput| { &mut m.change_token_metadata_uri }, + )); ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( "MintlayerAccountCommandTxInput", fields, @@ -3471,6 +3478,11 @@ impl ::protobuf::Message for MintlayerAccountCommandTxInput { return false; } }; + for v in &self.change_token_metadata_uri { + if !v.is_initialized() { + return false; + } + }; true } @@ -3507,6 +3519,9 @@ impl ::protobuf::Message for MintlayerAccountCommandTxInput { 82 => { ::protobuf::rt::read_singular_message_into_field(is, &mut self.change_token_authority)?; }, + 90 => { + ::protobuf::rt::read_singular_message_into_field(is, &mut self.change_token_metadata_uri)?; + }, tag => { ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; }, @@ -3556,6 +3571,10 @@ impl ::protobuf::Message for MintlayerAccountCommandTxInput { let len = v.compute_size(); my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; } + if let Some(v) = self.change_token_metadata_uri.as_ref() { + let len = v.compute_size(); + my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len; + } my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); self.special_fields.cached_size().set(my_size as u32); my_size @@ -3592,6 +3611,9 @@ impl ::protobuf::Message for MintlayerAccountCommandTxInput { if let Some(v) = self.change_token_authority.as_ref() { ::protobuf::rt::write_message_field_with_cached_size(10, v, os)?; } + if let Some(v) = self.change_token_metadata_uri.as_ref() { + ::protobuf::rt::write_message_field_with_cached_size(11, v, os)?; + } os.write_unknown_fields(self.special_fields.unknown_fields())?; ::std::result::Result::Ok(()) } @@ -3619,6 +3641,7 @@ impl ::protobuf::Message for MintlayerAccountCommandTxInput { self.freeze_token.clear(); self.unfreeze_token.clear(); self.change_token_authority.clear(); + self.change_token_metadata_uri.clear(); self.special_fields.clear(); } @@ -3634,6 +3657,7 @@ impl ::protobuf::Message for MintlayerAccountCommandTxInput { freeze_token: ::protobuf::MessageField::none(), unfreeze_token: ::protobuf::MessageField::none(), change_token_authority: ::protobuf::MessageField::none(), + change_token_metadata_uri: ::protobuf::MessageField::none(), special_fields: ::protobuf::SpecialFields::new(), }; &instance @@ -4777,6 +4801,224 @@ impl ::protobuf::reflect::ProtobufValue for MintlayerChangeTokenAuhtority { type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; } +// @@protoc_insertion_point(message:hw.trezor.messages.mintlayer.MintlayerChangeTokenMetadataUri) +#[derive(PartialEq,Clone,Default,Debug)] +pub struct MintlayerChangeTokenMetadataUri { + // message fields + // @@protoc_insertion_point(field:hw.trezor.messages.mintlayer.MintlayerChangeTokenMetadataUri.token_id) + pub token_id: ::std::option::Option<::std::vec::Vec>, + // @@protoc_insertion_point(field:hw.trezor.messages.mintlayer.MintlayerChangeTokenMetadataUri.metadata_uri) + pub metadata_uri: ::std::option::Option<::std::vec::Vec>, + // special fields + // @@protoc_insertion_point(special_field:hw.trezor.messages.mintlayer.MintlayerChangeTokenMetadataUri.special_fields) + pub special_fields: ::protobuf::SpecialFields, +} + +impl<'a> ::std::default::Default for &'a MintlayerChangeTokenMetadataUri { + fn default() -> &'a MintlayerChangeTokenMetadataUri { + ::default_instance() + } +} + +impl MintlayerChangeTokenMetadataUri { + pub fn new() -> MintlayerChangeTokenMetadataUri { + ::std::default::Default::default() + } + + // required bytes token_id = 1; + + pub fn token_id(&self) -> &[u8] { + match self.token_id.as_ref() { + Some(v) => v, + None => &[], + } + } + + pub fn clear_token_id(&mut self) { + self.token_id = ::std::option::Option::None; + } + + pub fn has_token_id(&self) -> bool { + self.token_id.is_some() + } + + // Param is passed by value, moved + pub fn set_token_id(&mut self, v: ::std::vec::Vec) { + self.token_id = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_token_id(&mut self) -> &mut ::std::vec::Vec { + if self.token_id.is_none() { + self.token_id = ::std::option::Option::Some(::std::vec::Vec::new()); + } + self.token_id.as_mut().unwrap() + } + + // Take field + pub fn take_token_id(&mut self) -> ::std::vec::Vec { + self.token_id.take().unwrap_or_else(|| ::std::vec::Vec::new()) + } + + // required bytes metadata_uri = 2; + + pub fn metadata_uri(&self) -> &[u8] { + match self.metadata_uri.as_ref() { + Some(v) => v, + None => &[], + } + } + + pub fn clear_metadata_uri(&mut self) { + self.metadata_uri = ::std::option::Option::None; + } + + pub fn has_metadata_uri(&self) -> bool { + self.metadata_uri.is_some() + } + + // Param is passed by value, moved + pub fn set_metadata_uri(&mut self, v: ::std::vec::Vec) { + self.metadata_uri = ::std::option::Option::Some(v); + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_metadata_uri(&mut self) -> &mut ::std::vec::Vec { + if self.metadata_uri.is_none() { + self.metadata_uri = ::std::option::Option::Some(::std::vec::Vec::new()); + } + self.metadata_uri.as_mut().unwrap() + } + + // Take field + pub fn take_metadata_uri(&mut self) -> ::std::vec::Vec { + self.metadata_uri.take().unwrap_or_else(|| ::std::vec::Vec::new()) + } + + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { + let mut fields = ::std::vec::Vec::with_capacity(2); + let mut oneofs = ::std::vec::Vec::with_capacity(0); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "token_id", + |m: &MintlayerChangeTokenMetadataUri| { &m.token_id }, + |m: &mut MintlayerChangeTokenMetadataUri| { &mut m.token_id }, + )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "metadata_uri", + |m: &MintlayerChangeTokenMetadataUri| { &m.metadata_uri }, + |m: &mut MintlayerChangeTokenMetadataUri| { &mut m.metadata_uri }, + )); + ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( + "MintlayerChangeTokenMetadataUri", + fields, + oneofs, + ) + } +} + +impl ::protobuf::Message for MintlayerChangeTokenMetadataUri { + const NAME: &'static str = "MintlayerChangeTokenMetadataUri"; + + fn is_initialized(&self) -> bool { + if self.token_id.is_none() { + return false; + } + if self.metadata_uri.is_none() { + return false; + } + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> { + while let Some(tag) = is.read_raw_tag_or_eof()? { + match tag { + 10 => { + self.token_id = ::std::option::Option::Some(is.read_bytes()?); + }, + 18 => { + self.metadata_uri = ::std::option::Option::Some(is.read_bytes()?); + }, + tag => { + ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u64 { + let mut my_size = 0; + if let Some(v) = self.token_id.as_ref() { + my_size += ::protobuf::rt::bytes_size(1, &v); + } + if let Some(v) = self.metadata_uri.as_ref() { + my_size += ::protobuf::rt::bytes_size(2, &v); + } + my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); + self.special_fields.cached_size().set(my_size as u32); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> { + if let Some(v) = self.token_id.as_ref() { + os.write_bytes(1, v)?; + } + if let Some(v) = self.metadata_uri.as_ref() { + os.write_bytes(2, v)?; + } + os.write_unknown_fields(self.special_fields.unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn special_fields(&self) -> &::protobuf::SpecialFields { + &self.special_fields + } + + fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields { + &mut self.special_fields + } + + fn new() -> MintlayerChangeTokenMetadataUri { + MintlayerChangeTokenMetadataUri::new() + } + + fn clear(&mut self) { + self.token_id = ::std::option::Option::None; + self.metadata_uri = ::std::option::Option::None; + self.special_fields.clear(); + } + + fn default_instance() -> &'static MintlayerChangeTokenMetadataUri { + static instance: MintlayerChangeTokenMetadataUri = MintlayerChangeTokenMetadataUri { + token_id: ::std::option::Option::None, + metadata_uri: ::std::option::Option::None, + special_fields: ::protobuf::SpecialFields::new(), + }; + &instance + } +} + +impl ::protobuf::MessageFull for MintlayerChangeTokenMetadataUri { + fn descriptor() -> ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new(); + descriptor.get(|| file_descriptor().message_by_package_relative_name("MintlayerChangeTokenMetadataUri").unwrap()).clone() + } +} + +impl ::std::fmt::Display for MintlayerChangeTokenMetadataUri { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for MintlayerChangeTokenMetadataUri { + type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage; +} + // @@protoc_insertion_point(message:hw.trezor.messages.mintlayer.MintlayerTxOutput) #[derive(PartialEq,Clone,Default,Debug)] pub struct MintlayerTxOutput { @@ -10515,7 +10757,7 @@ static file_descriptor_proto_data: &'static [u8] = b"\ e\x18\x03\x20\x01(\r:\n4294967295R\x08sequence\x12H\n\x05value\x18\x04\ \x20\x02(\x0b22.hw.trezor.messages.mintlayer.MintlayerOutputValueR\x05va\ lue\x12\x14\n\x05nonce\x18\x05\x20\x02(\x04R\x05nonce\x12#\n\rdelegation\ - _id\x18\x06\x20\x02(\x0cR\x0cdelegationId\"\xe8\x05\n\x1eMintlayerAccoun\ + _id\x18\x06\x20\x02(\x0cR\x0cdelegationId\"\xe2\x06\n\x1eMintlayerAccoun\ tCommandTxInput\x12O\n\taddress_n\x18\x01\x20\x03(\x0b22.hw.trezor.messa\ ges.mintlayer.MintlayerAddressPathR\x08addressN\x12\x18\n\x07address\x18\ \x02\x20\x02(\tR\x07address\x12&\n\x08sequence\x18\x03\x20\x01(\r:\n4294\ @@ -10529,7 +10771,9 @@ static file_descriptor_proto_data: &'static [u8] = b"\ Token\x12[\n\x0eunfreeze_token\x18\t\x20\x01(\x0b24.hw.trezor.messages.m\ intlayer.MintlayerUnfreezeTokenR\runfreezeToken\x12q\n\x16change_token_a\ uthority\x18\n\x20\x01(\x0b2;.hw.trezor.messages.mintlayer.MintlayerChan\ - geTokenAuhtorityR\x14changeTokenAuthority\"H\n\x13MintlayerMintTokens\ + geTokenAuhtorityR\x14changeTokenAuthority\x12x\n\x19change_token_metadat\ + a_uri\x18\x0b\x20\x01(\x0b2=.hw.trezor.messages.mintlayer.MintlayerChang\ + eTokenMetadataUriR\x16changeTokenMetadataUri\"H\n\x13MintlayerMintTokens\ \x12\x19\n\x08token_id\x18\x01\x20\x02(\x0cR\x07tokenId\x12\x16\n\x06amo\ unt\x18\x02\x20\x02(\x0cR\x06amount\"2\n\x15MintlayerUnmintTokens\x12\ \x19\n\x08token_id\x18\x01\x20\x02(\x0cR\x07tokenId\"5\n\x18MintlayerLoc\ @@ -10539,60 +10783,62 @@ static file_descriptor_proto_data: &'static [u8] = b"\ freezabe\"3\n\x16MintlayerUnfreezeToken\x12\x19\n\x08token_id\x18\x01\ \x20\x02(\x0cR\x07tokenId\"\\\n\x1dMintlayerChangeTokenAuhtority\x12\x19\ \n\x08token_id\x18\x01\x20\x02(\x0cR\x07tokenId\x12\x20\n\x0bdestination\ - \x18\x02\x20\x02(\tR\x0bdestination\"\xde\x08\n\x11MintlayerTxOutput\x12\ - S\n\x08transfer\x18\x01\x20\x01(\x0b27.hw.trezor.messages.mintlayer.Mint\ - layerTransferTxOutputR\x08transfer\x12m\n\x12lock_then_transfer\x18\x02\ - \x20\x01(\x0b2?.hw.trezor.messages.mintlayer.MintlayerLockThenTransferTx\ - OutputR\x10lockThenTransfer\x12G\n\x04burn\x18\x03\x20\x01(\x0b23.hw.tre\ - zor.messages.mintlayer.MintlayerBurnTxOutputR\x04burn\x12j\n\x11create_s\ - take_pool\x18\x04\x20\x01(\x0b2>.hw.trezor.messages.mintlayer.MintlayerC\ - reateStakePoolTxOutputR\x0fcreateStakePool\x12}\n\x18produce_block_from_\ - stake\x18\x05\x20\x01(\x0b2D.hw.trezor.messages.mintlayer.MintlayerProdu\ - ceBlockFromStakeTxOutputR\x15produceBlockFromStake\x12s\n\x14create_dele\ - gation_id\x18\x06\x20\x01(\x0b2A.hw.trezor.messages.mintlayer.MintlayerC\ - reateDelegationIdTxOutputR\x12createDelegationId\x12i\n\x10delegate_stak\ - ing\x18\x07\x20\x01(\x0b2>.hw.trezor.messages.mintlayer.MintlayerDelegat\ - eStakingTxOutputR\x0fdelegateStaking\x12s\n\x14issue_fungible_token\x18\ - \x08\x20\x01(\x0b2A.hw.trezor.messages.mintlayer.MintlayerIssueFungibleT\ - okenTxOutputR\x12issueFungibleToken\x12T\n\tissue_nft\x18\t\x20\x01(\x0b\ - 27.hw.trezor.messages.mintlayer.MintlayerIssueNftTxOutputR\x08issueNft\ - \x12]\n\x0cdata_deposit\x18\n\x20\x01(\x0b2:.hw.trezor.messages.mintlaye\ - r.MintlayerDataDepositTxOutputR\x0bdataDeposit\x12G\n\x04htlc\x18\x0b\ - \x20\x01(\x0b23.hw.trezor.messages.mintlayer.MintlayerHtlcTxOutputR\x04h\ - tlc\"\x87\x01\n\x19MintlayerTokenOutputValue\x12\x19\n\x08token_id\x18\ - \x01\x20\x02(\x0cR\x07tokenId\x12!\n\x0ctoken_ticker\x18\x02\x20\x02(\ - \x0cR\x0btokenTicker\x12,\n\x12number_of_decimals\x18\x03\x20\x02(\rR\ - \x10numberOfDecimals\"}\n\x14MintlayerOutputValue\x12\x16\n\x06amount\ - \x18\x01\x20\x02(\x0cR\x06amount\x12M\n\x05token\x18\x02\x20\x01(\x0b27.\ - hw.trezor.messages.mintlayer.MintlayerTokenOutputValueR\x05token\"\x7f\n\ - \x19MintlayerTransferTxOutput\x12\x18\n\x07address\x18\x01\x20\x02(\tR\ - \x07address\x12H\n\x05value\x18\x02\x20\x02(\x0b22.hw.trezor.messages.mi\ - ntlayer.MintlayerOutputValueR\x05value\"\xa4\x01\n\x17MintlayerOutputTim\ - eLock\x12!\n\x0cuntil_height\x18\x01\x20\x01(\x04R\x0buntilHeight\x12\ - \x1d\n\nuntil_time\x18\x02\x20\x01(\x04R\tuntilTime\x12&\n\x0ffor_block_\ - count\x18\x03\x20\x01(\x04R\rforBlockCount\x12\x1f\n\x0bfor_seconds\x18\ - \x04\x20\x01(\x04R\nforSeconds\"\xd2\x01\n!MintlayerLockThenTransferTxOu\ - tput\x12\x18\n\x07address\x18\x01\x20\x01(\tR\x07address\x12H\n\x05value\ - \x18\x02\x20\x02(\x0b22.hw.trezor.messages.mintlayer.MintlayerOutputValu\ - eR\x05value\x12I\n\x04lock\x18\x03\x20\x02(\x0b25.hw.trezor.messages.min\ - tlayer.MintlayerOutputTimeLockR\x04lock\"a\n\x15MintlayerBurnTxOutput\ - \x12H\n\x05value\x18\x01\x20\x02(\x0b22.hw.trezor.messages.mintlayer.Min\ - tlayerOutputValueR\x05value\"\x9d\x02\n\x20MintlayerCreateStakePoolTxOut\ - put\x12\x17\n\x07pool_id\x18\x01\x20\x02(\x0cR\x06poolId\x12\x16\n\x06pl\ - edge\x18\x02\x20\x02(\x0cR\x06pledge\x12\x16\n\x06staker\x18\x03\x20\x02\ - (\tR\x06staker\x12$\n\x0evrf_public_key\x18\x04\x20\x02(\tR\x0cvrfPublic\ - Key\x12)\n\x10decommission_key\x18\x05\x20\x02(\tR\x0fdecommissionKey\ - \x129\n\x19margin_ratio_per_thousand\x18\x06\x20\x02(\rR\x16marginRatioP\ - erThousand\x12$\n\x0ecost_per_block\x18\x07\x20\x02(\x0cR\x0ccostPerBloc\ - k\"c\n&MintlayerProduceBlockFromStakeTxOutput\x12\x20\n\x0bdestination\ - \x18\x01\x20\x02(\tR\x0bdestination\x12\x17\n\x07pool_id\x18\x02\x20\x02\ - (\x0cR\x06poolId\"`\n#MintlayerCreateDelegationIdTxOutput\x12\x20\n\x0bd\ - estination\x18\x01\x20\x02(\tR\x0bdestination\x12\x17\n\x07pool_id\x18\ - \x02\x20\x02(\x0cR\x06poolId\"_\n\x20MintlayerDelegateStakingTxOutput\ - \x12\x16\n\x06amount\x18\x01\x20\x02(\x0cR\x06amount\x12#\n\rdelegation_\ - id\x18\x02\x20\x02(\x0cR\x0cdelegationId\"\x8f\x01\n\x19MintlayerTokenTo\ - talSupply\x12O\n\x04type\x18\x01\x20\x02(\x0e2;.hw.trezor.messages.mintl\ - ayer.MintlayerTokenTotalSupplyTypeR\x04type\x12!\n\x0cfixed_amount\x18\ + \x18\x02\x20\x02(\tR\x0bdestination\"_\n\x1fMintlayerChangeTokenMetadata\ + Uri\x12\x19\n\x08token_id\x18\x01\x20\x02(\x0cR\x07tokenId\x12!\n\x0cmet\ + adata_uri\x18\x02\x20\x02(\x0cR\x0bmetadataUri\"\xde\x08\n\x11MintlayerT\ + xOutput\x12S\n\x08transfer\x18\x01\x20\x01(\x0b27.hw.trezor.messages.min\ + tlayer.MintlayerTransferTxOutputR\x08transfer\x12m\n\x12lock_then_transf\ + er\x18\x02\x20\x01(\x0b2?.hw.trezor.messages.mintlayer.MintlayerLockThen\ + TransferTxOutputR\x10lockThenTransfer\x12G\n\x04burn\x18\x03\x20\x01(\ + \x0b23.hw.trezor.messages.mintlayer.MintlayerBurnTxOutputR\x04burn\x12j\ + \n\x11create_stake_pool\x18\x04\x20\x01(\x0b2>.hw.trezor.messages.mintla\ + yer.MintlayerCreateStakePoolTxOutputR\x0fcreateStakePool\x12}\n\x18produ\ + ce_block_from_stake\x18\x05\x20\x01(\x0b2D.hw.trezor.messages.mintlayer.\ + MintlayerProduceBlockFromStakeTxOutputR\x15produceBlockFromStake\x12s\n\ + \x14create_delegation_id\x18\x06\x20\x01(\x0b2A.hw.trezor.messages.mintl\ + ayer.MintlayerCreateDelegationIdTxOutputR\x12createDelegationId\x12i\n\ + \x10delegate_staking\x18\x07\x20\x01(\x0b2>.hw.trezor.messages.mintlayer\ + .MintlayerDelegateStakingTxOutputR\x0fdelegateStaking\x12s\n\x14issue_fu\ + ngible_token\x18\x08\x20\x01(\x0b2A.hw.trezor.messages.mintlayer.Mintlay\ + erIssueFungibleTokenTxOutputR\x12issueFungibleToken\x12T\n\tissue_nft\ + \x18\t\x20\x01(\x0b27.hw.trezor.messages.mintlayer.MintlayerIssueNftTxOu\ + tputR\x08issueNft\x12]\n\x0cdata_deposit\x18\n\x20\x01(\x0b2:.hw.trezor.\ + messages.mintlayer.MintlayerDataDepositTxOutputR\x0bdataDeposit\x12G\n\ + \x04htlc\x18\x0b\x20\x01(\x0b23.hw.trezor.messages.mintlayer.MintlayerHt\ + lcTxOutputR\x04htlc\"\x87\x01\n\x19MintlayerTokenOutputValue\x12\x19\n\ + \x08token_id\x18\x01\x20\x02(\x0cR\x07tokenId\x12!\n\x0ctoken_ticker\x18\ + \x02\x20\x02(\x0cR\x0btokenTicker\x12,\n\x12number_of_decimals\x18\x03\ + \x20\x02(\rR\x10numberOfDecimals\"}\n\x14MintlayerOutputValue\x12\x16\n\ + \x06amount\x18\x01\x20\x02(\x0cR\x06amount\x12M\n\x05token\x18\x02\x20\ + \x01(\x0b27.hw.trezor.messages.mintlayer.MintlayerTokenOutputValueR\x05t\ + oken\"\x7f\n\x19MintlayerTransferTxOutput\x12\x18\n\x07address\x18\x01\ + \x20\x02(\tR\x07address\x12H\n\x05value\x18\x02\x20\x02(\x0b22.hw.trezor\ + .messages.mintlayer.MintlayerOutputValueR\x05value\"\xa4\x01\n\x17Mintla\ + yerOutputTimeLock\x12!\n\x0cuntil_height\x18\x01\x20\x01(\x04R\x0buntilH\ + eight\x12\x1d\n\nuntil_time\x18\x02\x20\x01(\x04R\tuntilTime\x12&\n\x0ff\ + or_block_count\x18\x03\x20\x01(\x04R\rforBlockCount\x12\x1f\n\x0bfor_sec\ + onds\x18\x04\x20\x01(\x04R\nforSeconds\"\xd2\x01\n!MintlayerLockThenTran\ + sferTxOutput\x12\x18\n\x07address\x18\x01\x20\x01(\tR\x07address\x12H\n\ + \x05value\x18\x02\x20\x02(\x0b22.hw.trezor.messages.mintlayer.MintlayerO\ + utputValueR\x05value\x12I\n\x04lock\x18\x03\x20\x02(\x0b25.hw.trezor.mes\ + sages.mintlayer.MintlayerOutputTimeLockR\x04lock\"a\n\x15MintlayerBurnTx\ + Output\x12H\n\x05value\x18\x01\x20\x02(\x0b22.hw.trezor.messages.mintlay\ + er.MintlayerOutputValueR\x05value\"\x9d\x02\n\x20MintlayerCreateStakePoo\ + lTxOutput\x12\x17\n\x07pool_id\x18\x01\x20\x02(\x0cR\x06poolId\x12\x16\n\ + \x06pledge\x18\x02\x20\x02(\x0cR\x06pledge\x12\x16\n\x06staker\x18\x03\ + \x20\x02(\tR\x06staker\x12$\n\x0evrf_public_key\x18\x04\x20\x02(\tR\x0cv\ + rfPublicKey\x12)\n\x10decommission_key\x18\x05\x20\x02(\tR\x0fdecommissi\ + onKey\x129\n\x19margin_ratio_per_thousand\x18\x06\x20\x02(\rR\x16marginR\ + atioPerThousand\x12$\n\x0ecost_per_block\x18\x07\x20\x02(\x0cR\x0ccostPe\ + rBlock\"c\n&MintlayerProduceBlockFromStakeTxOutput\x12\x20\n\x0bdestinat\ + ion\x18\x01\x20\x02(\tR\x0bdestination\x12\x17\n\x07pool_id\x18\x02\x20\ + \x02(\x0cR\x06poolId\"`\n#MintlayerCreateDelegationIdTxOutput\x12\x20\n\ + \x0bdestination\x18\x01\x20\x02(\tR\x0bdestination\x12\x17\n\x07pool_id\ + \x18\x02\x20\x02(\x0cR\x06poolId\"_\n\x20MintlayerDelegateStakingTxOutpu\ + t\x12\x16\n\x06amount\x18\x01\x20\x02(\x0cR\x06amount\x12#\n\rdelegation\ + _id\x18\x02\x20\x02(\x0cR\x0cdelegationId\"\x8f\x01\n\x19MintlayerTokenT\ + otalSupply\x12O\n\x04type\x18\x01\x20\x02(\x0e2;.hw.trezor.messages.mint\ + layer.MintlayerTokenTotalSupplyTypeR\x04type\x12!\n\x0cfixed_amount\x18\ \x02\x20\x01(\x0cR\x0bfixedAmount\"\xb6\x02\n#MintlayerIssueFungibleToke\ nTxOutput\x12!\n\x0ctoken_ticker\x18\x01\x20\x02(\x0cR\x0btokenTicker\ \x12,\n\x12number_of_decimals\x18\x02\x20\x02(\rR\x10numberOfDecimals\ @@ -10653,7 +10899,7 @@ pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor { file_descriptor.get(|| { let generated_file_descriptor = generated_file_descriptor_lazy.get(|| { let mut deps = ::std::vec::Vec::with_capacity(0); - let mut messages = ::std::vec::Vec::with_capacity(44); + let mut messages = ::std::vec::Vec::with_capacity(45); messages.push(MintlayerGetAddress::generated_message_descriptor_data()); messages.push(MintlayerAddress::generated_message_descriptor_data()); messages.push(MintlayerGetPublicKey::generated_message_descriptor_data()); @@ -10672,6 +10918,7 @@ pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor { messages.push(MintlayerFreezeToken::generated_message_descriptor_data()); messages.push(MintlayerUnfreezeToken::generated_message_descriptor_data()); messages.push(MintlayerChangeTokenAuhtority::generated_message_descriptor_data()); + messages.push(MintlayerChangeTokenMetadataUri::generated_message_descriptor_data()); messages.push(MintlayerTxOutput::generated_message_descriptor_data()); messages.push(MintlayerTokenOutputValue::generated_message_descriptor_data()); messages.push(MintlayerOutputValue::generated_message_descriptor_data());