diff --git a/multiversx_sdk/__init__.py b/multiversx_sdk/__init__.py index 29d5e97c..12347220 100644 --- a/multiversx_sdk/__init__.py +++ b/multiversx_sdk/__init__.py @@ -35,10 +35,10 @@ ) from multiversx_sdk.entrypoints import ( DevnetEntrypoint, + LocalnetEntrypoint, MainnetEntrypoint, NetworkEntrypoint, TestnetEntrypoint, - LocalnetEntrypoint, ) from multiversx_sdk.ledger.ledger_app import LedgerApp from multiversx_sdk.network_providers import ( @@ -79,15 +79,21 @@ AddQuantityOutcome, BurnOutcome, BurnQuantityOutcome, + ChangeTokenToDynamicOutcome, FreezeOutcome, IssueFungibleOutcome, IssueNonFungibleOutcome, IssueSemiFungibleOutcome, + MetadataRecreateOutcome, MintOutcome, + ModifyCreatorOutcome, + ModifyRoyaltiesOutcome, NFTCreateOutcome, PauseOutcome, RegisterAndSetAllRolesOutcome, + RegisterDynamicOutcome, RegisterMetaEsdtOutcome, + SetNewUrisOutcome, SetSpecialRoleOutcome, TokenManagementController, TokenManagementTransactionsFactory, @@ -96,6 +102,7 @@ UnFreezeOutcome, UnPauseOutcome, UpdateAttributesOutcome, + UpdateMetadataOutcome, WipeOutcome, ) from multiversx_sdk.transfers import TransfersController, TransferTransactionsFactory @@ -219,4 +226,11 @@ "LedgerApp", "LedgerAccount", "LocalnetEntrypoint", + "ModifyRoyaltiesOutcome", + "SetNewUrisOutcome", + "ModifyCreatorOutcome", + "UpdateMetadataOutcome", + "MetadataRecreateOutcome", + "ChangeTokenToDynamicOutcome", + "RegisterDynamicOutcome", ] diff --git a/multiversx_sdk/token_management/__init__.py b/multiversx_sdk/token_management/__init__.py index 73f10e11..f4dc7775 100644 --- a/multiversx_sdk/token_management/__init__.py +++ b/multiversx_sdk/token_management/__init__.py @@ -12,19 +12,26 @@ AddQuantityOutcome, BurnOutcome, BurnQuantityOutcome, + ChangeTokenToDynamicOutcome, FreezeOutcome, IssueFungibleOutcome, IssueNonFungibleOutcome, IssueSemiFungibleOutcome, + MetadataRecreateOutcome, MintOutcome, + ModifyCreatorOutcome, + ModifyRoyaltiesOutcome, NFTCreateOutcome, PauseOutcome, RegisterAndSetAllRolesOutcome, + RegisterDynamicOutcome, RegisterMetaEsdtOutcome, + SetNewUrisOutcome, SetSpecialRoleOutcome, UnFreezeOutcome, UnPauseOutcome, UpdateAttributesOutcome, + UpdateMetadataOutcome, WipeOutcome, ) @@ -50,4 +57,11 @@ "UnPauseOutcome", "UpdateAttributesOutcome", "WipeOutcome", + "ModifyRoyaltiesOutcome", + "SetNewUrisOutcome", + "ModifyCreatorOutcome", + "UpdateMetadataOutcome", + "MetadataRecreateOutcome", + "ChangeTokenToDynamicOutcome", + "RegisterDynamicOutcome", ] diff --git a/multiversx_sdk/token_management/token_management_controller.py b/multiversx_sdk/token_management/token_management_controller.py index c80a789c..87aa50ef 100644 --- a/multiversx_sdk/token_management/token_management_controller.py +++ b/multiversx_sdk/token_management/token_management_controller.py @@ -16,19 +16,26 @@ AddQuantityOutcome, BurnOutcome, BurnQuantityOutcome, + ChangeTokenToDynamicOutcome, FreezeOutcome, IssueFungibleOutcome, IssueNonFungibleOutcome, IssueSemiFungibleOutcome, + MetadataRecreateOutcome, MintOutcome, + ModifyCreatorOutcome, + ModifyRoyaltiesOutcome, NFTCreateOutcome, PauseOutcome, RegisterAndSetAllRolesOutcome, + RegisterDynamicOutcome, RegisterMetaEsdtOutcome, + SetNewUrisOutcome, SetSpecialRoleOutcome, UnFreezeOutcome, UnPauseOutcome, UpdateAttributesOutcome, + UpdateMetadataOutcome, WipeOutcome, ) @@ -939,6 +946,13 @@ def create_transaction_for_modifying_royalties( return transaction + def parse_modify_royalties(self, transaction_on_network: TransactionOnNetwork) -> list[ModifyRoyaltiesOutcome]: + return self.parser.parse_modify_royalties(transaction_on_network) + + def await_completed_modify_royalties(self, transaction_hash: Union[str, bytes]) -> list[ModifyRoyaltiesOutcome]: + transaction = self.network_provider.await_transaction_completed(transaction_hash) + return self.parse_modify_royalties(transaction) + def create_transaction_for_setting_new_uris( self, sender: IAccount, @@ -965,6 +979,13 @@ def create_transaction_for_setting_new_uris( return transaction + def parse_set_new_uris(self, transaction_on_network: TransactionOnNetwork) -> list[SetNewUrisOutcome]: + return self.parser.parse_set_new_uris(transaction_on_network) + + def await_completed_set_new_uris(self, transaction_hash: Union[str, bytes]) -> list[SetNewUrisOutcome]: + transaction = self.network_provider.await_transaction_completed(transaction_hash) + return self.parse_set_new_uris(transaction) + def create_transaction_for_modifying_creator( self, sender: IAccount, @@ -987,6 +1008,13 @@ def create_transaction_for_modifying_creator( return transaction + def parse_modify_creator(self, transaction_on_network: TransactionOnNetwork) -> list[ModifyCreatorOutcome]: + return self.parser.parse_modify_creator(transaction_on_network) + + def await_completed_modify_creator(self, transaction_hash: Union[str, bytes]) -> list[ModifyCreatorOutcome]: + transaction = self.network_provider.await_transaction_completed(transaction_hash) + return self.parse_modify_creator(transaction) + def create_transaction_for_updating_metadata( self, sender: IAccount, @@ -1021,6 +1049,13 @@ def create_transaction_for_updating_metadata( return transaction + def parse_update_metadata(self, transaction_on_network: TransactionOnNetwork) -> list[UpdateMetadataOutcome]: + return self.parser.parse_update_metadata(transaction_on_network) + + def await_completed_update_metadata(self, transaction_hash: Union[str, bytes]) -> list[UpdateMetadataOutcome]: + transaction = self.network_provider.await_transaction_completed(transaction_hash) + return self.parse_update_metadata(transaction) + def create_transaction_for_nft_metadata_recreate( self, sender: IAccount, @@ -1055,6 +1090,13 @@ def create_transaction_for_nft_metadata_recreate( return transaction + def parse_metadata_recreate(self, transaction_on_network: TransactionOnNetwork) -> list[MetadataRecreateOutcome]: + return self.parser.parse_metadata_recreate(transaction_on_network) + + def await_completed_metadata_recreate(self, transaction_hash: Union[str, bytes]) -> list[MetadataRecreateOutcome]: + transaction = self.network_provider.await_transaction_completed(transaction_hash) + return self.parse_metadata_recreate(transaction) + def create_transaction_for_changing_token_to_dynamic( self, sender: IAccount, @@ -1078,6 +1120,17 @@ def create_transaction_for_changing_token_to_dynamic( return transaction + def parse_change_token_to_dynamic( + self, transaction_on_network: TransactionOnNetwork + ) -> list[ChangeTokenToDynamicOutcome]: + return self.parser.parse_change_token_to_dynamic(transaction_on_network) + + def await_completed_change_token_to_dynamic( + self, transaction_hash: Union[str, bytes] + ) -> list[ChangeTokenToDynamicOutcome]: + transaction = self.network_provider.await_transaction_completed(transaction_hash) + return self.parse_change_token_to_dynamic(transaction) + def create_transaction_for_updating_token_id( self, sender: IAccount, @@ -1100,6 +1153,9 @@ def create_transaction_for_updating_token_id( return transaction + def await_completed_update_token_id(self, transaction_hash: Union[str, bytes]) -> TransactionOnNetwork: + return self.network_provider.await_transaction_completed(transaction_hash) + def create_transaction_for_registering_dynamic_token( self, sender: IAccount, @@ -1128,6 +1184,17 @@ def create_transaction_for_registering_dynamic_token( return transaction + def parse_register_dynamic_token( + self, transaction_on_network: TransactionOnNetwork + ) -> list[RegisterDynamicOutcome]: + return self.parser.parse_register_dynamic_token(transaction_on_network) + + def await_completed_register_dynamic_token( + self, transaction_hash: Union[str, bytes] + ) -> list[RegisterDynamicOutcome]: + transaction = self.network_provider.await_transaction_completed(transaction_hash) + return self.parse_register_dynamic_token(transaction) + def create_transaction_for_registering_dynamic_and_setting_roles( self, sender: IAccount, @@ -1156,6 +1223,17 @@ def create_transaction_for_registering_dynamic_and_setting_roles( return transaction + def parse_register_dynamic_token_and_setting_roles( + self, transaction_on_network: TransactionOnNetwork + ) -> list[RegisterDynamicOutcome]: + return self.parser.parse_register_dynamic_and_setting_roles(transaction_on_network) + + def await_completed_register_dynamic_token_and_setting_roles( + self, transaction_hash: Union[str, bytes] + ) -> list[RegisterDynamicOutcome]: + transaction = self.network_provider.await_transaction_completed(transaction_hash) + return self.parse_register_dynamic_token_and_setting_roles(transaction) + def create_transaction_for_transferring_ownership( self, sender: IAccount, diff --git a/multiversx_sdk/token_management/token_management_transactions_outcome_parser.py b/multiversx_sdk/token_management/token_management_transactions_outcome_parser.py index 89a7b23b..d4544d83 100644 --- a/multiversx_sdk/token_management/token_management_transactions_outcome_parser.py +++ b/multiversx_sdk/token_management/token_management_transactions_outcome_parser.py @@ -11,19 +11,26 @@ AddQuantityOutcome, BurnOutcome, BurnQuantityOutcome, + ChangeTokenToDynamicOutcome, FreezeOutcome, IssueFungibleOutcome, IssueNonFungibleOutcome, IssueSemiFungibleOutcome, + MetadataRecreateOutcome, MintOutcome, + ModifyCreatorOutcome, + ModifyRoyaltiesOutcome, NFTCreateOutcome, PauseOutcome, RegisterAndSetAllRolesOutcome, + RegisterDynamicOutcome, RegisterMetaEsdtOutcome, + SetNewUrisOutcome, SetSpecialRoleOutcome, UnFreezeOutcome, UnPauseOutcome, UpdateAttributesOutcome, + UpdateMetadataOutcome, WipeOutcome, ) @@ -231,6 +238,133 @@ def parse_burn_quantity(self, transaction: TransactionOnNetwork) -> list[BurnQua for event in events ] + def parse_modify_royalties(self, transaction: TransactionOnNetwork) -> list[ModifyRoyaltiesOutcome]: + self._ensure_no_error(transaction.logs.events) + + events = find_events_by_identifier(transaction, "ESDTModifyRoyalties") + return [ + ModifyRoyaltiesOutcome( + token_identifier=self._extract_token_identifier(event), + nonce=self._extract_nonce(event), + royalties=self._extract_royalties(event.topics), + ) + for event in events + ] + + def _extract_royalties(self, topics: list[bytes]) -> int: + if not len(topics[3]): + return 0 + return int.from_bytes(topics[3], byteorder="big", signed=False) + + def parse_set_new_uris(self, transaction: TransactionOnNetwork) -> list[SetNewUrisOutcome]: + self._ensure_no_error(transaction.logs.events) + + events = find_events_by_identifier(transaction, "ESDTSetNewURIs") + return [ + SetNewUrisOutcome( + token_identifier=self._extract_token_identifier(event), + nonce=self._extract_nonce(event), + uris=self._extract_uris(event.topics), + ) + for event in events + ] + + def _extract_uris(self, topics: list[bytes]) -> list[str]: + if not len(topics[3]): + return [""] + return [topic.decode() for topic in topics[3:]] + + def parse_modify_creator(self, transaction: TransactionOnNetwork) -> list[ModifyCreatorOutcome]: + self._ensure_no_error(transaction.logs.events) + + events = find_events_by_identifier(transaction, "ESDTModifyCreator") + return [ + ModifyCreatorOutcome( + token_identifier=self._extract_token_identifier(event), nonce=self._extract_nonce(event) + ) + for event in events + ] + + def parse_update_metadata(self, transaction: TransactionOnNetwork) -> list[UpdateMetadataOutcome]: + self._ensure_no_error(transaction.logs.events) + + events = find_events_by_identifier(transaction, "ESDTMetaDataUpdate") + return [ + UpdateMetadataOutcome( + token_identifier=self._extract_token_identifier(event), + nonce=self._extract_nonce(event), + metadata=event.topics[3] if len(event.topics[3]) else b"", + ) + for event in events + ] + + def parse_metadata_recreate(self, transaction: TransactionOnNetwork) -> list[MetadataRecreateOutcome]: + self._ensure_no_error(transaction.logs.events) + + events = find_events_by_identifier(transaction, "ESDTMetaDataRecreate") + return [ + MetadataRecreateOutcome( + token_identifier=self._extract_token_identifier(event), + nonce=self._extract_nonce(event), + metadata=event.topics[3] if len(event.topics[3]) else b"", + ) + for event in events + ] + + def parse_change_token_to_dynamic(self, transaction: TransactionOnNetwork) -> list[ChangeTokenToDynamicOutcome]: + self._ensure_no_error(transaction.logs.events) + + events = find_events_by_identifier(transaction, "changeToDynamic") + return [ + ChangeTokenToDynamicOutcome( + token_identifier=self._extract_token_identifier(event), + token_name=event.topics[1].decode() if len(event.topics[1]) else "", + ticker=event.topics[2].decode() if len(event.topics[2]) else "", + token_type=event.topics[3].decode() if len(event.topics[3]) else "", + ) + for event in events + ] + + def parse_register_dynamic_token(self, transaction: TransactionOnNetwork) -> list[RegisterDynamicOutcome]: + self._ensure_no_error(transaction.logs.events) + + events = find_events_by_identifier(transaction, "registerDynamic") + return [ + RegisterDynamicOutcome( + token_identifier=self._extract_token_identifier(event), + token_name=event.topics[1].decode() if len(event.topics[1]) else "", + ticker=event.topics[2].decode() if len(event.topics[2]) else "", + token_type=event.topics[3].decode() if len(event.topics[3]) else "", + num_of_decimals=( + int.from_bytes(event.topics[4], byteorder="big", signed=False) + if len(event.topics) > 4 and event.topics[4] + else 0 + ), + ) + for event in events + ] + + def parse_register_dynamic_and_setting_roles( + self, transaction: TransactionOnNetwork + ) -> list[RegisterDynamicOutcome]: + self._ensure_no_error(transaction.logs.events) + + events = find_events_by_identifier(transaction, "registerAndSetAllRolesDynamic") + return [ + RegisterDynamicOutcome( + token_identifier=self._extract_token_identifier(event), + token_name=event.topics[1].decode() if len(event.topics[1]) else "", + ticker=event.topics[2].decode() if len(event.topics[2]) else "", + token_type=event.topics[3].decode() if len(event.topics[3]) else "", + num_of_decimals=( + int.from_bytes(bytes.fromhex(event.topics[4].decode()), byteorder="big", signed=False) + if len(event.topics) > 4 and event.topics[4] + else 0 + ), + ) + for event in events + ] + def _ensure_no_error(self, transaction_events: list[TransactionEvent]) -> None: for event in transaction_events: if event.identifier == "signalError": diff --git a/multiversx_sdk/token_management/token_management_transactions_outcome_parser_test.py b/multiversx_sdk/token_management/token_management_transactions_outcome_parser_test.py index e957a44e..088d7ff4 100644 --- a/multiversx_sdk/token_management/token_management_transactions_outcome_parser_test.py +++ b/multiversx_sdk/token_management/token_management_transactions_outcome_parser_test.py @@ -622,3 +622,278 @@ def test_parse_burn_quantity(self): assert outcome[0].token_identifier == identifier assert outcome[0].nonce == nonce assert outcome[0].burnt_quantity == burnt_quantity + + def test_parse_modify_royalties(self): + identifier = "TEST-e2b0f9" + nonce = 1 + royalties = 20 + + encoded_topics = [base64.b64encode(identifier.encode()), "AQ==", "", "FA=="] + + event = TransactionEvent( + raw={}, + address=Address.new_from_bech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"), + identifier="ESDTModifyRoyalties", + topics=base64_topics_to_bytes(encoded_topics), + data=b"", + additional_data=[], + ) + + logs = TransactionLogs( + address=Address.new_from_bech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"), + events=[event], + ) + + transaction = get_empty_transaction_on_network() + transaction.logs = logs + + outcome = self.parser.parse_modify_royalties(transaction) + assert len(outcome) == 1 + assert outcome[0].token_identifier == identifier + assert outcome[0].nonce == nonce + assert outcome[0].royalties == royalties + + def test_parse_set_new_uris(self): + identifier = "TEST-e2b0f9" + nonce = 1 + uri = "thisianuri.com" + + encoded_topics = [base64.b64encode(identifier.encode()), "AQ==", "", "dGhpc2lhbnVyaS5jb20="] + + event = TransactionEvent( + raw={}, + address=Address.new_from_bech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"), + identifier="ESDTSetNewURIs", + topics=base64_topics_to_bytes(encoded_topics), + data=b"", + additional_data=[], + ) + + logs = TransactionLogs( + address=Address.new_from_bech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"), + events=[event], + ) + + transaction = get_empty_transaction_on_network() + transaction.logs = logs + + outcome = self.parser.parse_set_new_uris(transaction) + assert len(outcome) == 1 + assert outcome[0].token_identifier == identifier + assert outcome[0].nonce == nonce + + assert len(outcome[0].uris) == 1 + assert outcome[0].uris[0] == uri + + def test_parse_modify_creator(self): + identifier = "TEST-e2b0f9" + nonce = 1 + + encoded_topics = [base64.b64encode(identifier.encode()), "AQ=="] + + event = TransactionEvent( + raw={}, + address=Address.new_from_bech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"), + identifier="ESDTModifyCreator", + topics=base64_topics_to_bytes(encoded_topics), + data=b"", + additional_data=[], + ) + + logs = TransactionLogs( + address=Address.new_from_bech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"), + events=[event], + ) + + transaction = get_empty_transaction_on_network() + transaction.logs = logs + + outcome = self.parser.parse_modify_creator(transaction) + assert len(outcome) == 1 + assert outcome[0].token_identifier == identifier + assert outcome[0].nonce == nonce + + def test_parse_update_metadata(self): + identifier = "TEST-e2b0f9" + nonce = 1 + metadata = base64.b64decode( + "CAUSAgABIlQIARIHVEVTVE5GVBogATlHLv9ohncamC8wg9pdQh8kwpGB5jiIIo3IHKYNaeEgHioIbmV3X2hhc2gyDnRoaXNpYW51cmkuY29tOgkAAAAAAAAAAwUqHgjH9a4DEMf1rgMYx/WuAyDH9a4DKMb1rgMwx/WuAw==" + ) + + encoded_topics = [ + base64.b64encode(identifier.encode()), + "AQ==", + "", + "CAUSAgABIlQIARIHVEVTVE5GVBogATlHLv9ohncamC8wg9pdQh8kwpGB5jiIIo3IHKYNaeEgHioIbmV3X2hhc2gyDnRoaXNpYW51cmkuY29tOgkAAAAAAAAAAwUqHgjH9a4DEMf1rgMYx/WuAyDH9a4DKMb1rgMwx/WuAw==", + ] + + event = TransactionEvent( + raw={}, + address=Address.new_from_bech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"), + identifier="ESDTMetaDataUpdate", + topics=base64_topics_to_bytes(encoded_topics), + data=b"", + additional_data=[], + ) + + logs = TransactionLogs( + address=Address.new_from_bech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"), + events=[event], + ) + + transaction = get_empty_transaction_on_network() + transaction.logs = logs + + outcome = self.parser.parse_update_metadata(transaction) + assert len(outcome) == 1 + assert outcome[0].token_identifier == identifier + assert outcome[0].nonce == nonce + assert outcome[0].metadata == metadata + + def test_parse_recreate_metadata(self): + identifier = "TEST-e2b0f9" + nonce = 1 + metadata = base64.b64decode( + "CAUSAgABIlAIARIHVEVTVE5GVBogATlHLv9ohncamC8wg9pdQh8kwpGB5jiIIo3IHKYNaeEgHioSbmV3X2hhc2hfcmVjcmVhdGVkMgA6CQAAAAAAAABkASoeCMj1rgMQyPWuAxjI9a4DIMj1rgMoyPWuAzDI9a4D" + ) + + encoded_topics = [ + base64.b64encode(identifier.encode()), + "AQ==", + "", + "CAUSAgABIlAIARIHVEVTVE5GVBogATlHLv9ohncamC8wg9pdQh8kwpGB5jiIIo3IHKYNaeEgHioSbmV3X2hhc2hfcmVjcmVhdGVkMgA6CQAAAAAAAABkASoeCMj1rgMQyPWuAxjI9a4DIMj1rgMoyPWuAzDI9a4D", + ] + + event = TransactionEvent( + raw={}, + address=Address.new_from_bech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"), + identifier="ESDTMetaDataRecreate", + topics=base64_topics_to_bytes(encoded_topics), + data=b"", + additional_data=[], + ) + + logs = TransactionLogs( + address=Address.new_from_bech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"), + events=[event], + ) + + transaction = get_empty_transaction_on_network() + transaction.logs = logs + + outcome = self.parser.parse_metadata_recreate(transaction) + assert len(outcome) == 1 + assert outcome[0].token_identifier == identifier + assert outcome[0].nonce == nonce + assert outcome[0].metadata == metadata + + def test_parse_change_to_dynamic(self): + identifier = "LKXOXNO-503365" + token_name = "LKXOXNO" + ticker = "LKXOXNO" + token_type = "DynamicMetaESDT" + + encoded_topics = [ + base64.b64encode(identifier.encode()), + "TEtYT1hOTw==", + "TEtYT1hOTw==", + "RHluYW1pY01ldGFFU0RU", + ] + + event = TransactionEvent( + raw={}, + address=Address.new_from_bech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"), + identifier="changeToDynamic", + topics=base64_topics_to_bytes(encoded_topics), + data=b"", + additional_data=[], + ) + + logs = TransactionLogs( + address=Address.new_from_bech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"), + events=[event], + ) + + transaction = get_empty_transaction_on_network() + transaction.logs = logs + + outcome = self.parser.parse_change_token_to_dynamic(transaction) + assert len(outcome) == 1 + assert outcome[0].token_identifier == identifier + assert outcome[0].token_name == token_name + assert outcome[0].ticker == ticker + assert outcome[0].token_type == token_type + + def test_parse_register_dynamic(self): + identifier = "TEST-9bbb21" + token_name = "TESTNFT" + ticker = "TEST" + token_type = "DynamicNonFungibleESDT" + + encoded_topics = [ + base64.b64encode(identifier.encode()), + "VEVTVE5GVA==", + "VEVTVA==", + "RHluYW1pY05vbkZ1bmdpYmxlRVNEVA==", + ] + + event = TransactionEvent( + raw={}, + address=Address.new_from_bech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"), + identifier="registerDynamic", + topics=base64_topics_to_bytes(encoded_topics), + data=b"", + additional_data=[], + ) + + logs = TransactionLogs( + address=Address.new_from_bech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"), + events=[event], + ) + + transaction = get_empty_transaction_on_network() + transaction.logs = logs + + outcome = self.parser.parse_register_dynamic_token(transaction) + assert len(outcome) == 1 + assert outcome[0].token_identifier == identifier + assert outcome[0].token_name == token_name + assert outcome[0].ticker == ticker + assert outcome[0].token_type == token_type + + def test_parse_register_dynamic_and_set_all_roles(self): + identifier = "TEST-9bbb21" + token_name = "TESTNFT" + ticker = "TEST" + token_type = "DynamicNonFungibleESDT" + + encoded_topics = [ + base64.b64encode(identifier.encode()), + "VEVTVE5GVA==", + "VEVTVA==", + "RHluYW1pY05vbkZ1bmdpYmxlRVNEVA==", + ] + + event = TransactionEvent( + raw={}, + address=Address.new_from_bech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"), + identifier="registerAndSetAllRolesDynamic", + topics=base64_topics_to_bytes(encoded_topics), + data=b"", + additional_data=[], + ) + + logs = TransactionLogs( + address=Address.new_from_bech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"), + events=[event], + ) + + transaction = get_empty_transaction_on_network() + transaction.logs = logs + + outcome = self.parser.parse_register_dynamic_and_setting_roles(transaction) + assert len(outcome) == 1 + assert outcome[0].token_identifier == identifier + assert outcome[0].token_name == token_name + assert outcome[0].ticker == ticker + assert outcome[0].token_type == token_type diff --git a/multiversx_sdk/token_management/token_management_transactions_outcome_parser_types.py b/multiversx_sdk/token_management/token_management_transactions_outcome_parser_types.py index 15f9d251..5f08177b 100644 --- a/multiversx_sdk/token_management/token_management_transactions_outcome_parser_types.py +++ b/multiversx_sdk/token_management/token_management_transactions_outcome_parser_types.py @@ -112,3 +112,54 @@ class BurnQuantityOutcome: token_identifier: str nonce: int burnt_quantity: int + + +@dataclass +class ModifyRoyaltiesOutcome: + token_identifier: str + nonce: int + royalties: int + + +@dataclass +class SetNewUrisOutcome: + token_identifier: str + nonce: int + uris: list[str] + + +@dataclass +class ModifyCreatorOutcome: + token_identifier: str + nonce: int + + +@dataclass +class UpdateMetadataOutcome: + token_identifier: str + nonce: int + metadata: bytes + + +@dataclass +class MetadataRecreateOutcome: + token_identifier: str + nonce: int + metadata: bytes + + +@dataclass +class ChangeTokenToDynamicOutcome: + token_identifier: str + token_name: str + ticker: str + token_type: str + + +@dataclass +class RegisterDynamicOutcome: + token_identifier: str + token_name: str + ticker: str + token_type: str + num_of_decimals: int