diff --git a/examples/Cookbook.ipynb b/examples/Cookbook.ipynb index 2a747302..f7ad1d06 100644 --- a/examples/Cookbook.ipynb +++ b/examples/Cookbook.ipynb @@ -206,7 +206,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'nonce': 77, 'value': '1000000000000000000', 'receiver': 'erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 50000, 'data': '', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': ''}\n" + "{'nonce': 77, 'value': '1000000000000000000', 'receiver': 'erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 50000, 'data': '', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': '', 'relayer': '', 'innerTransactions': []}\n" ] } ], @@ -256,7 +256,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'nonce': 77, 'value': '1000000000000000000', 'receiver': 'erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 50000, 'data': 'Zm9yIHRoZSBib29r', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': ''}\n" + "{'nonce': 77, 'value': '1000000000000000000', 'receiver': 'erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 50000, 'data': 'Zm9yIHRoZSBib29r', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': '', 'relayer': '', 'innerTransactions': []}\n" ] } ], @@ -308,7 +308,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Transaction: {'nonce': 0, 'value': '1000000000000000000', 'receiver': 'erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 68000, 'data': 'Zm9yIHRoZSBib29r', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': ''}\n", + "Transaction: {'nonce': 0, 'value': '1000000000000000000', 'receiver': 'erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 68000, 'data': 'Zm9yIHRoZSBib29r', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': '', 'relayer': '', 'innerTransactions': []}\n", "Transaction data: for the book\n" ] } @@ -348,7 +348,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Transaction: {'nonce': 0, 'value': '0', 'receiver': 'erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 410000, 'data': 'RVNEVFRyYW5zZmVyQDU0NDU1MzU0MmQzODYyMzAzMjM4NjZAMjcxMA==', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': ''}\n", + "Transaction: {'nonce': 0, 'value': '0', 'receiver': 'erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 410000, 'data': 'RVNEVFRyYW5zZmVyQDU0NDU1MzU0MmQzODYyMzAzMjM4NjZAMjcxMA==', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': '', 'relayer': '', 'innerTransactions': []}\n", "Transaction data: ESDTTransfer@544553542d386230323866@2710\n" ] } @@ -387,7 +387,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Transaction: {'nonce': 0, 'value': '0', 'receiver': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 1213500, 'data': 'RVNEVE5GVFRyYW5zZmVyQDU0NDU1MzU0MmQzMzM4NjYzMjM0MzlAMDFAMDFAODA0OWQ2MzllNWE2OTgwZDFjZDIzOTJhYmNjZTQxMDI5Y2RhNzRhMTU2MzUyM2EyMDJmMDk2NDFjYzI2MThmOA==', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': ''}\n", + "Transaction: {'nonce': 0, 'value': '0', 'receiver': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 1213500, 'data': 'RVNEVE5GVFRyYW5zZmVyQDU0NDU1MzU0MmQzMzM4NjYzMjM0MzlAMDFAMDFAODA0OWQ2MzllNWE2OTgwZDFjZDIzOTJhYmNjZTQxMDI5Y2RhNzRhMTU2MzUyM2EyMDJmMDk2NDFjYzI2MThmOA==', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': '', 'relayer': '', 'innerTransactions': []}\n", "Transaction data: ESDTNFTTransfer@544553542d333866323439@01@01@8049d639e5a6980d1cd2392abcce41029cda74a1563523a202f09641cc2618f8\n" ] } @@ -422,7 +422,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Transaction: {'nonce': 0, 'value': '0', 'receiver': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 1213500, 'data': 'RVNEVE5GVFRyYW5zZmVyQDUzNDU0ZDQ5MmQzOTY1NjY2NDMwNjZAMDFAMDVAODA0OWQ2MzllNWE2OTgwZDFjZDIzOTJhYmNjZTQxMDI5Y2RhNzRhMTU2MzUyM2EyMDJmMDk2NDFjYzI2MThmOA==', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': ''}\n", + "Transaction: {'nonce': 0, 'value': '0', 'receiver': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 1213500, 'data': 'RVNEVE5GVFRyYW5zZmVyQDUzNDU0ZDQ5MmQzOTY1NjY2NDMwNjZAMDFAMDVAODA0OWQ2MzllNWE2OTgwZDFjZDIzOTJhYmNjZTQxMDI5Y2RhNzRhMTU2MzUyM2EyMDJmMDk2NDFjYzI2MThmOA==', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': '', 'relayer': '', 'innerTransactions': []}\n", "Transaction data: ESDTNFTTransfer@53454d492d396566643066@01@05@8049d639e5a6980d1cd2392abcce41029cda74a1563523a202f09641cc2618f8\n" ] } @@ -457,7 +457,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Transaction: {'nonce': 0, 'value': '0', 'receiver': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 1484000, 'data': 'TXVsdGlFU0RUTkZUVHJhbnNmZXJAODA0OWQ2MzllNWE2OTgwZDFjZDIzOTJhYmNjZTQxMDI5Y2RhNzRhMTU2MzUyM2EyMDJmMDk2NDFjYzI2MThmOEAwMkA1NDQ1NTM1NDJkMzMzODY2MzIzNDM5QDAxQDAxQDQyNDE1MjJkNjMzODMwNjQzMjM5QEA4YWM3MjMwNDg5ZTgwMDAw', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': ''}\n", + "Transaction: {'nonce': 0, 'value': '0', 'receiver': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 1484000, 'data': 'TXVsdGlFU0RUTkZUVHJhbnNmZXJAODA0OWQ2MzllNWE2OTgwZDFjZDIzOTJhYmNjZTQxMDI5Y2RhNzRhMTU2MzUyM2EyMDJmMDk2NDFjYzI2MThmOEAwMkA1NDQ1NTM1NDJkMzMzODY2MzIzNDM5QDAxQDAxQDQyNDE1MjJkNjMzODMwNjQzMjM5QEA4YWM3MjMwNDg5ZTgwMDAw', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': '', 'relayer': '', 'innerTransactions': []}\n", "Transaction data: MultiESDTNFTTransfer@8049d639e5a6980d1cd2392abcce41029cda74a1563523a202f09641cc2618f8@02@544553542d333866323439@01@01@4241522d633830643239@@8ac7230489e80000\n" ] } @@ -562,7 +562,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'nonce': 2627, 'value': '0', 'receiver': 'erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 61052000, 'data': 'cmVsYXllZFR4QDdiMjI2ZTZmNmU2MzY1MjIzYTMxMzkzODJjMjI3MzY1NmU2NDY1NzIyMjNhMjI2NzQ1NmU1NzRmNjU1NzZkNmQ0MTMwNjMzMDZhNmI3MTc2NGQzNTQyNDE3MDdhNjE2NDRiNDY1NzRlNTM0ZjY5NDE3NjQzNTc1MTYzNzc2ZDQ3NTA2NzNkMjIyYzIyNzI2NTYzNjU2OTc2NjU3MjIyM2EyMjQxNDE0MTQxNDE0MTQxNDE0MTQxNDE0NjQxNDE1OTQ2NGUyYjRkNGU1NTY5MzUzODY3NjI0MjMzMzUyYjYzNTY2NzczNGM1OTM5NzI2NzY1NjE2NTQ1M2QyMjJjMjI3NjYxNmM3NTY1MjIzYTMwMmMyMjY3NjE3MzUwNzI2OTYzNjUyMjNhMzEzMDMwMzAzMDMwMzAzMDMwMzAyYzIyNjc2MTczNGM2OTZkNjk3NDIyM2EzNjMwMzAzMDMwMzAzMDMwMmMyMjY0NjE3NDYxMjIzYTIyNTk1NzUyNmI1MTQ0NDEzMTIyMmMyMjczNjk2NzZlNjE3NDc1NzI2NTIyM2EyMjQ3NGM0MzM0NGE1OTM1NGMzMDc1NmY0YTRkNzA0ODc1MzQ0ODUwNTc2NzQ3NDE0ODQ3NmY0NzZhN2E0NzYxMzYzNTJiNzU0ODMwMzAyZjc3NGM1MTU5NDU1MTUyMzA2NDVhNGM2MzUxMzQ1NDZkNzE1NTM5NGI2ZDUxNWEzNTU0NzE2ZDRjNmU1MzUxMzQ1NjU3NDY2ZjM1NDM2Njc5Mzk2MzY0MmI2YzQzNDEzZDNkMjIyYzIyNjM2ODYxNjk2ZTQ5NDQyMjNhMjI1MjQxM2QzZDIyMmMyMjc2NjU3MjczNjk2ZjZlMjIzYTMyN2Q=', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': ''}\n" + "{'nonce': 2627, 'value': '0', 'receiver': 'erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 61052000, 'data': 'cmVsYXllZFR4QDdiMjI2ZTZmNmU2MzY1MjIzYTMxMzkzODJjMjI3MzY1NmU2NDY1NzIyMjNhMjI2NzQ1NmU1NzRmNjU1NzZkNmQ0MTMwNjMzMDZhNmI3MTc2NGQzNTQyNDE3MDdhNjE2NDRiNDY1NzRlNTM0ZjY5NDE3NjQzNTc1MTYzNzc2ZDQ3NTA2NzNkMjIyYzIyNzI2NTYzNjU2OTc2NjU3MjIyM2EyMjQxNDE0MTQxNDE0MTQxNDE0MTQxNDE0NjQxNDE1OTQ2NGUyYjRkNGU1NTY5MzUzODY3NjI0MjMzMzUyYjYzNTY2NzczNGM1OTM5NzI2NzY1NjE2NTQ1M2QyMjJjMjI3NjYxNmM3NTY1MjIzYTMwMmMyMjY3NjE3MzUwNzI2OTYzNjUyMjNhMzEzMDMwMzAzMDMwMzAzMDMwMzAyYzIyNjc2MTczNGM2OTZkNjk3NDIyM2EzNjMwMzAzMDMwMzAzMDMwMmMyMjY0NjE3NDYxMjIzYTIyNTk1NzUyNmI1MTQ0NDEzMTIyMmMyMjczNjk2NzZlNjE3NDc1NzI2NTIyM2EyMjQ3NGM0MzM0NGE1OTM1NGMzMDc1NmY0YTRkNzA0ODc1MzQ0ODUwNTc2NzQ3NDE0ODQ3NmY0NzZhN2E0NzYxMzYzNTJiNzU0ODMwMzAyZjc3NGM1MTU5NDU1MTUyMzA2NDVhNGM2MzUxMzQ1NDZkNzE1NTM5NGI2ZDUxNWEzNTU0NzE2ZDRjNmU1MzUxMzQ1NjU3NDY2ZjM1NDM2Njc5Mzk2MzY0MmI2YzQzNDEzZDNkMjIyYzIyNjM2ODYxNjk2ZTQ5NDQyMjNhMjI1MjQxM2QzZDIyMmMyMjc2NjU3MjczNjk2ZjZlMjIzYTMyN2Q=', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': '', 'relayer': '', 'innerTransactions': []}\n" ] } ], @@ -615,7 +615,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'nonce': 37, 'value': '0', 'receiver': 'erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 60381500, 'data': 'cmVsYXllZFR4VjJAMDAwMDAwMDAwMDAwMDAwMDA1MDAwNjA1MzdlMzBkNTIyZTdjODFiMDc3ZTdlNzE1ODJjMmQ4ZjZiODFlNjllMUAwZkA2MTY0NjQ0MDMwMzVANjUwNzJhOTExOGRiMTQ3NDdhNGYxY2Y4NTdhNmU0MzczZTNlOWVhZDZlYTYwMzZmNTExMWJmNjg4MDNjNWNhZGZkYzQ0ZDM3YTIxYjkyMDQ0OWI1ZTgzYzc4Mzk3NTQyNWMzZjQ3NjAyMDE3M2FjMGZjNzE0ODE2NDZkNGE5MDA=', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': ''}\n" + "{'nonce': 37, 'value': '0', 'receiver': 'erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 60381500, 'data': 'cmVsYXllZFR4VjJAMDAwMDAwMDAwMDAwMDAwMDA1MDAwNjA1MzdlMzBkNTIyZTdjODFiMDc3ZTdlNzE1ODJjMmQ4ZjZiODFlNjllMUAwZkA2MTY0NjQ0MDMwMzVANjUwNzJhOTExOGRiMTQ3NDdhNGYxY2Y4NTdhNmU0MzczZTNlOWVhZDZlYTYwMzZmNTExMWJmNjg4MDNjNWNhZGZkYzQ0ZDM3YTIxYjkyMDQ0OWI1ZTgzYzc4Mzk3NTQyNWMzZjQ3NjAyMDE3M2FjMGZjNzE0ODE2NDZkNGE5MDA=', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': '', 'relayer': '', 'innerTransactions': []}\n" ] } ], @@ -848,7 +848,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Transaction: {'nonce': 0, 'value': '0', 'receiver': 'erd1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq6gq4hu', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 10000000, 'data': 'MDA2MTczNmQwMTAwMDAwMDAxMjkwODYwMDAwMDYwMDAwMTdmNjAwMjdmN2YwMTdmNjAwMjdmN2YwMDYwMDE3ZjAwNjAwMzdmN2Y3ZjAxN2Y2MDAzN2Y3ZjdmMDA2MDAxN2YwMTdmMDI5MDAyMGIwMzY1NmU3NjE5NjI2OTY3NDk2ZTc0NDc2NTc0NTU2ZTczNjk2NzZlNjU2NDQxNzI2Nzc1NmQ2NTZlNzQwMDAzMDM2NTZlNzYwZjY3NjU3NDRlNzU2ZDQxNzI2Nzc1NmQ2NTZlNzQ3MzAwMDEwMzY1NmU3NjBiNzM2OTY3NmU2MTZjNDU3MjcyNmY3MjAwMDMwMzY1NmU3NjEyNmQ0Mjc1NjY2NjY1NzI1Mzc0NmY3MjYxNjc2NTRjNmY2MTY0MDAwMjAzNjU2ZTc2MTc2ZDQyNzU2NjY2NjU3MjU0NmY0MjY5Njc0OTZlNzQ1NTZlNzM2OTY3NmU2NTY0MDAwMjAzNjU2ZTc2MTk2ZDQyNzU2NjY2NjU3MjQ2NzI2ZjZkNDI2OTY3NDk2ZTc0NTU2ZTczNjk2NzZlNjU2NDAwMDIwMzY1NmU3NjEzNmQ0Mjc1NjY2NjY1NzI1Mzc0NmY3MjYxNjc2NTUzNzQ2ZjcyNjUwMDAyMDM2NTZlNzYwZjZkNDI3NTY2NjY2NTcyNTM2NTc0NDI3OTc0NjU3MzAwMDUwMzY1NmU3NjBlNjM2ODY1NjM2YjRlNmY1MDYxNzk2ZDY1NmU3NDAwMDAwMzY1NmU3NjE0NjI2OTY3NDk2ZTc0NDY2OTZlNjk3MzY4NTU2ZTczNjk2NzZlNjU2NDAwMDQwMzY1NmU3NjA5NjI2OTY3NDk2ZTc0NDE2NDY0MDAwNjAzMGIwYTAxMDEwNDA3MDMwMTAwMDAwMDAwMDUwMzAxMDAwMzA2MGYwMjdmMDA0MWEwODAwODBiN2YwMDQxYTA4MDA4MGIwNzQ2MDcwNjZkNjU2ZDZmNzI3OTAyMDAwNDY5NmU2OTc0MDAxMTA2Njc2NTc0NTM3NTZkMDAxMjAzNjE2NDY0MDAxMzA4NjM2MTZjNmM0MjYxNjM2YjAwMTQwYTVmNWY2NDYxNzQ2MTVmNjU2ZTY0MDMwMDBiNWY1ZjY4NjU2MTcwNWY2MjYxNzM2NTAzMDEwYWNhMDEwYTBlMDEwMTdmNDEwMDEwMGMyMjAwMTAwMDIwMDAwYjE5MDEwMTdmNDE5YzgwMDg0MTljODAwODI4MDIwMDQxMDE2YjIyMDAzNjAyMDAyMDAwMGIxNDAwMTAwMTIwMDA0NjA0NDAwZjBiNDE4MDgwMDg0MTE5MTAwMjAwMGIxNjAwMjAwMDEwMGMyMjAwMTAwMzFhMjAwMDEwMGMyMjAwMTAwNDFhMjAwMDBiMTQwMTAxN2YxMDBjMjIwMjIwMDExMDA1MWEyMDAwMjAwMjEwMDYxYTBiMTMwMTAxN2YxMDBjMjIwMDQxOTk4MDA4NDEwMzEwMDcxYTIwMDAwYjE0MDEwMTdmMTAwODQxMDExMDBkMTAwYjIxMDAxMDEwMjAwMDEwMGYwYjBlMDAxMDA4NDEwMDEwMGQxMDEwMTAwZTEwMDkwYjIyMDEwMzdmMTAwODQxMDExMDBkMTAwYjIxMDExMDEwMjIwMjEwMGUyMjAwMjAwMDIwMDExMDBhMjAwMjIwMDAxMDBmMGIwMzAwMDEwYjBiMmYwMjAwNDE4MDgwMDgwYjFjNzc3MjZmNmU2NzIwNmU3NTZkNjI2NTcyMjA2ZjY2MjA2MTcyNjc3NTZkNjU2ZTc0NzM3Mzc1NmQwMDQxOWM4MDA4MGIwNDljZmZmZmZmQDA1MDBAMDUwNkAyYQ==', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': ''}\n", + "Transaction: {'nonce': 0, 'value': '0', 'receiver': 'erd1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq6gq4hu', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 10000000, 'data': 'MDA2MTczNmQwMTAwMDAwMDAxMjkwODYwMDAwMDYwMDAwMTdmNjAwMjdmN2YwMTdmNjAwMjdmN2YwMDYwMDE3ZjAwNjAwMzdmN2Y3ZjAxN2Y2MDAzN2Y3ZjdmMDA2MDAxN2YwMTdmMDI5MDAyMGIwMzY1NmU3NjE5NjI2OTY3NDk2ZTc0NDc2NTc0NTU2ZTczNjk2NzZlNjU2NDQxNzI2Nzc1NmQ2NTZlNzQwMDAzMDM2NTZlNzYwZjY3NjU3NDRlNzU2ZDQxNzI2Nzc1NmQ2NTZlNzQ3MzAwMDEwMzY1NmU3NjBiNzM2OTY3NmU2MTZjNDU3MjcyNmY3MjAwMDMwMzY1NmU3NjEyNmQ0Mjc1NjY2NjY1NzI1Mzc0NmY3MjYxNjc2NTRjNmY2MTY0MDAwMjAzNjU2ZTc2MTc2ZDQyNzU2NjY2NjU3MjU0NmY0MjY5Njc0OTZlNzQ1NTZlNzM2OTY3NmU2NTY0MDAwMjAzNjU2ZTc2MTk2ZDQyNzU2NjY2NjU3MjQ2NzI2ZjZkNDI2OTY3NDk2ZTc0NTU2ZTczNjk2NzZlNjU2NDAwMDIwMzY1NmU3NjEzNmQ0Mjc1NjY2NjY1NzI1Mzc0NmY3MjYxNjc2NTUzNzQ2ZjcyNjUwMDAyMDM2NTZlNzYwZjZkNDI3NTY2NjY2NTcyNTM2NTc0NDI3OTc0NjU3MzAwMDUwMzY1NmU3NjBlNjM2ODY1NjM2YjRlNmY1MDYxNzk2ZDY1NmU3NDAwMDAwMzY1NmU3NjE0NjI2OTY3NDk2ZTc0NDY2OTZlNjk3MzY4NTU2ZTczNjk2NzZlNjU2NDAwMDQwMzY1NmU3NjA5NjI2OTY3NDk2ZTc0NDE2NDY0MDAwNjAzMGIwYTAxMDEwNDA3MDMwMTAwMDAwMDAwMDUwMzAxMDAwMzA2MGYwMjdmMDA0MWEwODAwODBiN2YwMDQxYTA4MDA4MGIwNzQ2MDcwNjZkNjU2ZDZmNzI3OTAyMDAwNDY5NmU2OTc0MDAxMTA2Njc2NTc0NTM3NTZkMDAxMjAzNjE2NDY0MDAxMzA4NjM2MTZjNmM0MjYxNjM2YjAwMTQwYTVmNWY2NDYxNzQ2MTVmNjU2ZTY0MDMwMDBiNWY1ZjY4NjU2MTcwNWY2MjYxNzM2NTAzMDEwYWNhMDEwYTBlMDEwMTdmNDEwMDEwMGMyMjAwMTAwMDIwMDAwYjE5MDEwMTdmNDE5YzgwMDg0MTljODAwODI4MDIwMDQxMDE2YjIyMDAzNjAyMDAyMDAwMGIxNDAwMTAwMTIwMDA0NjA0NDAwZjBiNDE4MDgwMDg0MTE5MTAwMjAwMGIxNjAwMjAwMDEwMGMyMjAwMTAwMzFhMjAwMDEwMGMyMjAwMTAwNDFhMjAwMDBiMTQwMTAxN2YxMDBjMjIwMjIwMDExMDA1MWEyMDAwMjAwMjEwMDYxYTBiMTMwMTAxN2YxMDBjMjIwMDQxOTk4MDA4NDEwMzEwMDcxYTIwMDAwYjE0MDEwMTdmMTAwODQxMDExMDBkMTAwYjIxMDAxMDEwMjAwMDEwMGYwYjBlMDAxMDA4NDEwMDEwMGQxMDEwMTAwZTEwMDkwYjIyMDEwMzdmMTAwODQxMDExMDBkMTAwYjIxMDExMDEwMjIwMjEwMGUyMjAwMjAwMDIwMDExMDBhMjAwMjIwMDAxMDBmMGIwMzAwMDEwYjBiMmYwMjAwNDE4MDgwMDgwYjFjNzc3MjZmNmU2NzIwNmU3NTZkNjI2NTcyMjA2ZjY2MjA2MTcyNjc3NTZkNjU2ZTc0NzM3Mzc1NmQwMDQxOWM4MDA4MGIwNDljZmZmZmZmQDA1MDBAMDUwNkAyYQ==', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': '', 'relayer': '', 'innerTransactions': []}\n", "Transaction data: 0061736d010000000129086000006000017f60027f7f017f60027f7f0060017f0060037f7f7f017f60037f7f7f0060017f017f0290020b03656e7619626967496e74476574556e7369676e6564417267756d656e74000303656e760f6765744e756d417267756d656e7473000103656e760b7369676e616c4572726f72000303656e76126d42756666657253746f726167654c6f6164000203656e76176d427566666572546f426967496e74556e7369676e6564000203656e76196d42756666657246726f6d426967496e74556e7369676e6564000203656e76136d42756666657253746f7261676553746f7265000203656e760f6d4275666665725365744279746573000503656e760e636865636b4e6f5061796d656e74000003656e7614626967496e7446696e697368556e7369676e6564000403656e7609626967496e744164640006030b0a010104070301000000000503010003060f027f0041a080080b7f0041a080080b074607066d656d6f7279020004696e697400110667657453756d00120361646400130863616c6c4261636b00140a5f5f646174615f656e6403000b5f5f686561705f6261736503010aca010a0e01017f4100100c2200100020000b1901017f419c8008419c800828020041016b220036020020000b1400100120004604400f0b4180800841191002000b16002000100c220010031a2000100c220010041a20000b1401017f100c2202200110051a2000200210061a0b1301017f100c220041998008410310071a20000b1401017f10084101100d100b210010102000100f0b0e0010084100100d1010100e10090b2201037f10084101100d100b210110102202100e220020002001100a20022000100f0b0300010b0b2f0200418080080b1c77726f6e67206e756d626572206f6620617267756d656e747373756d00419c80080b049cffffff@0500@0506@2a\n" ] } @@ -998,7 +998,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Transaction: {'nonce': 0, 'value': '0', 'receiver': 'erd1qqqqqqqqqqqqqpgquzmh78klkqwt0p4rjys0qtp3la07gz4d396qn50nnm', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 10000000, 'data': 'dXBncmFkZUNvbnRyYWN0QDAwNjE3MzZkMDEwMDAwMDAwMTI5MDg2MDAwMDA2MDAwMDE3ZjYwMDI3ZjdmMDE3ZjYwMDI3ZjdmMDA2MDAxN2YwMDYwMDM3ZjdmN2YwMTdmNjAwMzdmN2Y3ZjAwNjAwMTdmMDE3ZjAyOTAwMjBiMDM2NTZlNzYxOTYyNjk2NzQ5NmU3NDQ3NjU3NDU1NmU3MzY5Njc2ZTY1NjQ0MTcyNjc3NTZkNjU2ZTc0MDAwMzAzNjU2ZTc2MGY2NzY1NzQ0ZTc1NmQ0MTcyNjc3NTZkNjU2ZTc0NzMwMDAxMDM2NTZlNzYwYjczNjk2NzZlNjE2YzQ1NzI3MjZmNzIwMDAzMDM2NTZlNzYxMjZkNDI3NTY2NjY2NTcyNTM3NDZmNzI2MTY3NjU0YzZmNjE2NDAwMDIwMzY1NmU3NjE3NmQ0Mjc1NjY2NjY1NzI1NDZmNDI2OTY3NDk2ZTc0NTU2ZTczNjk2NzZlNjU2NDAwMDIwMzY1NmU3NjE5NmQ0Mjc1NjY2NjY1NzI0NjcyNmY2ZDQyNjk2NzQ5NmU3NDU1NmU3MzY5Njc2ZTY1NjQwMDAyMDM2NTZlNzYxMzZkNDI3NTY2NjY2NTcyNTM3NDZmNzI2MTY3NjU1Mzc0NmY3MjY1MDAwMjAzNjU2ZTc2MGY2ZDQyNzU2NjY2NjU3MjUzNjU3NDQyNzk3NDY1NzMwMDA1MDM2NTZlNzYwZTYzNjg2NTYzNmI0ZTZmNTA2MTc5NmQ2NTZlNzQwMDAwMDM2NTZlNzYxNDYyNjk2NzQ5NmU3NDQ2Njk2ZTY5NzM2ODU1NmU3MzY5Njc2ZTY1NjQwMDA0MDM2NTZlNzYwOTYyNjk2NzQ5NmU3NDQxNjQ2NDAwMDYwMzBiMGEwMTAxMDQwNzAzMDEwMDAwMDAwMDA1MDMwMTAwMDMwNjBmMDI3ZjAwNDFhMDgwMDgwYjdmMDA0MWEwODAwODBiMDc0NjA3MDY2ZDY1NmQ2ZjcyNzkwMjAwMDQ2OTZlNjk3NDAwMTEwNjY3NjU3NDUzNzU2ZDAwMTIwMzYxNjQ2NDAwMTMwODYzNjE2YzZjNDI2MTYzNmIwMDE0MGE1ZjVmNjQ2MTc0NjE1ZjY1NmU2NDAzMDAwYjVmNWY2ODY1NjE3MDVmNjI2MTczNjUwMzAxMGFjYTAxMGEwZTAxMDE3ZjQxMDAxMDBjMjIwMDEwMDAyMDAwMGIxOTAxMDE3ZjQxOWM4MDA4NDE5YzgwMDgyODAyMDA0MTAxNmIyMjAwMzYwMjAwMjAwMDBiMTQwMDEwMDEyMDAwNDYwNDQwMGYwYjQxODA4MDA4NDExOTEwMDIwMDBiMTYwMDIwMDAxMDBjMjIwMDEwMDMxYTIwMDAxMDBjMjIwMDEwMDQxYTIwMDAwYjE0MDEwMTdmMTAwYzIyMDIyMDAxMTAwNTFhMjAwMDIwMDIxMDA2MWEwYjEzMDEwMTdmMTAwYzIyMDA0MTk5ODAwODQxMDMxMDA3MWEyMDAwMGIxNDAxMDE3ZjEwMDg0MTAxMTAwZDEwMGIyMTAwMTAxMDIwMDAxMDBmMGIwZTAwMTAwODQxMDAxMDBkMTAxMDEwMGUxMDA5MGIyMjAxMDM3ZjEwMDg0MTAxMTAwZDEwMGIyMTAxMTAxMDIyMDIxMDBlMjIwMDIwMDAyMDAxMTAwYTIwMDIyMDAwMTAwZjBiMDMwMDAxMGIwYjJmMDIwMDQxODA4MDA4MGIxYzc3NzI2ZjZlNjcyMDZlNzU2ZDYyNjU3MjIwNmY2NjIwNjE3MjY3NzU2ZDY1NmU3NDczNzM3NTZkMDA0MTljODAwODBiMDQ5Y2ZmZmZmZkAwNTA2QDJh', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': ''}\n", + "Transaction: {'nonce': 0, 'value': '0', 'receiver': 'erd1qqqqqqqqqqqqqpgquzmh78klkqwt0p4rjys0qtp3la07gz4d396qn50nnm', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 10000000, 'data': 'dXBncmFkZUNvbnRyYWN0QDAwNjE3MzZkMDEwMDAwMDAwMTI5MDg2MDAwMDA2MDAwMDE3ZjYwMDI3ZjdmMDE3ZjYwMDI3ZjdmMDA2MDAxN2YwMDYwMDM3ZjdmN2YwMTdmNjAwMzdmN2Y3ZjAwNjAwMTdmMDE3ZjAyOTAwMjBiMDM2NTZlNzYxOTYyNjk2NzQ5NmU3NDQ3NjU3NDU1NmU3MzY5Njc2ZTY1NjQ0MTcyNjc3NTZkNjU2ZTc0MDAwMzAzNjU2ZTc2MGY2NzY1NzQ0ZTc1NmQ0MTcyNjc3NTZkNjU2ZTc0NzMwMDAxMDM2NTZlNzYwYjczNjk2NzZlNjE2YzQ1NzI3MjZmNzIwMDAzMDM2NTZlNzYxMjZkNDI3NTY2NjY2NTcyNTM3NDZmNzI2MTY3NjU0YzZmNjE2NDAwMDIwMzY1NmU3NjE3NmQ0Mjc1NjY2NjY1NzI1NDZmNDI2OTY3NDk2ZTc0NTU2ZTczNjk2NzZlNjU2NDAwMDIwMzY1NmU3NjE5NmQ0Mjc1NjY2NjY1NzI0NjcyNmY2ZDQyNjk2NzQ5NmU3NDU1NmU3MzY5Njc2ZTY1NjQwMDAyMDM2NTZlNzYxMzZkNDI3NTY2NjY2NTcyNTM3NDZmNzI2MTY3NjU1Mzc0NmY3MjY1MDAwMjAzNjU2ZTc2MGY2ZDQyNzU2NjY2NjU3MjUzNjU3NDQyNzk3NDY1NzMwMDA1MDM2NTZlNzYwZTYzNjg2NTYzNmI0ZTZmNTA2MTc5NmQ2NTZlNzQwMDAwMDM2NTZlNzYxNDYyNjk2NzQ5NmU3NDQ2Njk2ZTY5NzM2ODU1NmU3MzY5Njc2ZTY1NjQwMDA0MDM2NTZlNzYwOTYyNjk2NzQ5NmU3NDQxNjQ2NDAwMDYwMzBiMGEwMTAxMDQwNzAzMDEwMDAwMDAwMDA1MDMwMTAwMDMwNjBmMDI3ZjAwNDFhMDgwMDgwYjdmMDA0MWEwODAwODBiMDc0NjA3MDY2ZDY1NmQ2ZjcyNzkwMjAwMDQ2OTZlNjk3NDAwMTEwNjY3NjU3NDUzNzU2ZDAwMTIwMzYxNjQ2NDAwMTMwODYzNjE2YzZjNDI2MTYzNmIwMDE0MGE1ZjVmNjQ2MTc0NjE1ZjY1NmU2NDAzMDAwYjVmNWY2ODY1NjE3MDVmNjI2MTczNjUwMzAxMGFjYTAxMGEwZTAxMDE3ZjQxMDAxMDBjMjIwMDEwMDAyMDAwMGIxOTAxMDE3ZjQxOWM4MDA4NDE5YzgwMDgyODAyMDA0MTAxNmIyMjAwMzYwMjAwMjAwMDBiMTQwMDEwMDEyMDAwNDYwNDQwMGYwYjQxODA4MDA4NDExOTEwMDIwMDBiMTYwMDIwMDAxMDBjMjIwMDEwMDMxYTIwMDAxMDBjMjIwMDEwMDQxYTIwMDAwYjE0MDEwMTdmMTAwYzIyMDIyMDAxMTAwNTFhMjAwMDIwMDIxMDA2MWEwYjEzMDEwMTdmMTAwYzIyMDA0MTk5ODAwODQxMDMxMDA3MWEyMDAwMGIxNDAxMDE3ZjEwMDg0MTAxMTAwZDEwMGIyMTAwMTAxMDIwMDAxMDBmMGIwZTAwMTAwODQxMDAxMDBkMTAxMDEwMGUxMDA5MGIyMjAxMDM3ZjEwMDg0MTAxMTAwZDEwMGIyMTAxMTAxMDIyMDIxMDBlMjIwMDIwMDAyMDAxMTAwYTIwMDIyMDAwMTAwZjBiMDMwMDAxMGIwYjJmMDIwMDQxODA4MDA4MGIxYzc3NzI2ZjZlNjcyMDZlNzU2ZDYyNjU3MjIwNmY2NjIwNjE3MjY3NzU2ZDY1NmU3NDczNzM3NTZkMDA0MTljODAwODBiMDQ5Y2ZmZmZmZkAwNTA2QDJh', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': '', 'relayer': '', 'innerTransactions': []}\n", "Transaction data: upgradeContract@0061736d010000000129086000006000017f60027f7f017f60027f7f0060017f0060037f7f7f017f60037f7f7f0060017f017f0290020b03656e7619626967496e74476574556e7369676e6564417267756d656e74000303656e760f6765744e756d417267756d656e7473000103656e760b7369676e616c4572726f72000303656e76126d42756666657253746f726167654c6f6164000203656e76176d427566666572546f426967496e74556e7369676e6564000203656e76196d42756666657246726f6d426967496e74556e7369676e6564000203656e76136d42756666657253746f7261676553746f7265000203656e760f6d4275666665725365744279746573000503656e760e636865636b4e6f5061796d656e74000003656e7614626967496e7446696e697368556e7369676e6564000403656e7609626967496e744164640006030b0a010104070301000000000503010003060f027f0041a080080b7f0041a080080b074607066d656d6f7279020004696e697400110667657453756d00120361646400130863616c6c4261636b00140a5f5f646174615f656e6403000b5f5f686561705f6261736503010aca010a0e01017f4100100c2200100020000b1901017f419c8008419c800828020041016b220036020020000b1400100120004604400f0b4180800841191002000b16002000100c220010031a2000100c220010041a20000b1401017f100c2202200110051a2000200210061a0b1301017f100c220041998008410310071a20000b1401017f10084101100d100b210010102000100f0b0e0010084100100d1010100e10090b2201037f10084101100d100b210110102202100e220020002001100a20022000100f0b0300010b0b2f0200418080080b1c77726f6e67206e756d626572206f6620617267756d656e747373756d00419c80080b049cffffff@0506@2a\n" ] } @@ -1088,7 +1088,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Transaction: {'nonce': 0, 'value': '0', 'receiver': 'erd1qqqqqqqqqqqqqpgqws44xjx2t056nn79fn29q0rjwfrd3m43396ql35kxy', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 10000000, 'data': 'YWRkQDJh', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': ''}\n", + "Transaction: {'nonce': 0, 'value': '0', 'receiver': 'erd1qqqqqqqqqqqqqpgqws44xjx2t056nn79fn29q0rjwfrd3m43396ql35kxy', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 10000000, 'data': 'YWRkQDJh', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': '', 'relayer': '', 'innerTransactions': []}\n", "Transaction data: add@2a\n" ] } @@ -1183,7 +1183,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Transaction: {'nonce': 0, 'value': '0', 'receiver': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 10000000, 'data': 'TXVsdGlFU0RUTkZUVHJhbnNmZXJAMDAwMDAwMDAwMDAwMDAwMDA1MDA3NDJiNTM0OGNhNWJlOWE5Y2ZjNTRjZDQ1MDNjNzI3MjQ2ZDhlZWIxODk3NEAwMkA1NDQ1NTM1NDJkMzMzODY2MzIzNDM5QDAxQDAxQDQyNDE1MjJkNjMzODMwNjQzMjM5QEA4YWM3MjMwNDg5ZTgwMDAwQDYxNjQ2NEAyYQ==', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': ''}\n", + "Transaction: {'nonce': 0, 'value': '0', 'receiver': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'sender': 'erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th', 'senderUsername': '', 'receiverUsername': '', 'gasPrice': 1000000000, 'gasLimit': 10000000, 'data': 'TXVsdGlFU0RUTkZUVHJhbnNmZXJAMDAwMDAwMDAwMDAwMDAwMDA1MDA3NDJiNTM0OGNhNWJlOWE5Y2ZjNTRjZDQ1MDNjNzI3MjQ2ZDhlZWIxODk3NEAwMkA1NDQ1NTM1NDJkMzMzODY2MzIzNDM5QDAxQDAxQDQyNDE1MjJkNjMzODMwNjQzMjM5QEA4YWM3MjMwNDg5ZTgwMDAwQDYxNjQ2NEAyYQ==', 'chainID': 'D', 'version': 2, 'options': 0, 'guardian': '', 'signature': '', 'guardianSignature': '', 'relayer': '', 'innerTransactions': []}\n", "Transaction data: MultiESDTNFTTransfer@00000000000000000500742b5348ca5be9a9cfc54cd4503c727246d8eeb18974@02@544553542d333866323439@01@01@4241522d633830643239@@8ac7230489e80000@616464@2a\n" ] } @@ -1303,7 +1303,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 39, "metadata": {}, "outputs": [], "source": [ @@ -1325,7 +1325,7 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 40, "metadata": {}, "outputs": [], "source": [ @@ -1342,7 +1342,7 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 41, "metadata": {}, "outputs": [ { @@ -1372,7 +1372,7 @@ }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 42, "metadata": {}, "outputs": [ { @@ -1381,6 +1381,8 @@ "text": [ "Return code: ok\n", "Return data (raw): [b'\\x05']\n", + "Return data (parsed): [5]\n", + "Return data (raw): [b'\\x05']\n", "Return data (parsed): [5]\n" ] } @@ -1394,9 +1396,12 @@ "\n", "response = query_controller.run_query(query)\n", "data_parts = query_controller.parse_query_response(response)\n", + "data_parts = query_controller.parse_query_response(response)\n", "\n", "print(\"Return code:\", response.return_code)\n", "print(\"Return data (raw):\", response.return_data_parts)\n", + "print(\"Return data (parsed):\", data_parts)\n", + "print(\"Return data (raw):\", response.return_data_parts)\n", "print(\"Return data (parsed):\", data_parts)" ] }, @@ -1416,14 +1421,14 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "['calm', 'correct', 'orchard', 'earn', 'army', 'tower', 'token', 'dice', 'bleak', 'tackle', 'copper', 'walnut', 'sell', 'cradle', 'typical', 'supreme', 'lesson', 'laundry', 'silk', 'sand', 'feel', 'cancel', 'shoulder', 'rail']\n" + "['rich', 'solution', 'blue', 'ice', 'pass', 'clinic', 'beyond', 'chicken', 'people', 'field', 'release', 'planet', 'arrive', 'tornado', 'trip', 'math', 'circle', 'valley', 'describe', 'second', 'cool', 'range', 'devote', 'case']\n" ] } ], @@ -1446,7 +1451,7 @@ }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 44, "metadata": {}, "outputs": [], "source": [ @@ -1470,15 +1475,15 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Secret key: 74a35a90d0554b87277f432b00db2b2c17543034c86f3d23204f4d75cb2ca0a9\n", - "Public key: 2234d1d5eee679f5391d3c04678ee7761a3692e2f5b15393248a8a28b35d1a98\n" + "Secret key: 2892696376fef33c5f2c76754e2f701073d524588c7a9cd6681bd6d32bea6650\n", + "Public key: f481465e5a676ddc0d73157470e61703abf779496fbc90dce2e97a382bc2871c\n" ] } ], @@ -1500,7 +1505,7 @@ }, { "cell_type": "code", - "execution_count": 106, + "execution_count": 46, "metadata": {}, "outputs": [], "source": [ @@ -1521,7 +1526,7 @@ }, { "cell_type": "code", - "execution_count": 107, + "execution_count": 47, "metadata": {}, "outputs": [], "source": [ @@ -1560,7 +1565,7 @@ }, { "cell_type": "code", - "execution_count": 108, + "execution_count": 48, "metadata": {}, "outputs": [ { @@ -1592,7 +1597,7 @@ }, { "cell_type": "code", - "execution_count": 109, + "execution_count": 49, "metadata": {}, "outputs": [ { @@ -1622,7 +1627,7 @@ }, { "cell_type": "code", - "execution_count": 110, + "execution_count": 50, "metadata": {}, "outputs": [ { @@ -1659,7 +1664,7 @@ }, { "cell_type": "code", - "execution_count": 111, + "execution_count": 51, "metadata": {}, "outputs": [], "source": [ @@ -1677,7 +1682,7 @@ }, { "cell_type": "code", - "execution_count": 112, + "execution_count": 52, "metadata": {}, "outputs": [], "source": [ @@ -1693,7 +1698,7 @@ }, { "cell_type": "code", - "execution_count": 113, + "execution_count": 53, "metadata": {}, "outputs": [ { @@ -1731,7 +1736,7 @@ }, { "cell_type": "code", - "execution_count": 114, + "execution_count": 54, "metadata": {}, "outputs": [ { @@ -1770,7 +1775,7 @@ }, { "cell_type": "code", - "execution_count": 115, + "execution_count": 55, "metadata": {}, "outputs": [], "source": [ @@ -1792,7 +1797,7 @@ }, { "cell_type": "code", - "execution_count": 116, + "execution_count": 56, "metadata": {}, "outputs": [ { @@ -1841,7 +1846,7 @@ }, { "cell_type": "code", - "execution_count": 117, + "execution_count": 57, "metadata": {}, "outputs": [], "source": [ @@ -1859,7 +1864,7 @@ }, { "cell_type": "code", - "execution_count": 118, + "execution_count": 58, "metadata": {}, "outputs": [], "source": [ @@ -1884,7 +1889,7 @@ }, { "cell_type": "code", - "execution_count": 119, + "execution_count": 59, "metadata": {}, "outputs": [ { @@ -1919,15 +1924,15 @@ }, { "cell_type": "code", - "execution_count": 120, + "execution_count": 60, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Nonce: 1465\n", - "Balance: 7728263062706014403\n" + "Nonce: 1853\n", + "Balance: 3364970609086014407\n" ] } ], @@ -1947,7 +1952,7 @@ }, { "cell_type": "code", - "execution_count": 121, + "execution_count": 61, "metadata": {}, "outputs": [], "source": [ @@ -1982,14 +1987,14 @@ }, { "cell_type": "code", - "execution_count": 122, + "execution_count": 62, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Transaction hash: 0e32fcf92dc500c343714092df451296820bcd35d1158302729fe7d6b505a1ce\n" + "Transaction hash: 999da2b84011ffd6aedb966c8262804bb5280064a77f543f841e4eae96af8013\n" ] } ], @@ -2021,14 +2026,14 @@ }, { "cell_type": "code", - "execution_count": 123, + "execution_count": 63, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Transactions hashes: (3, {'0': '0e32fcf92dc500c343714092df451296820bcd35d1158302729fe7d6b505a1ce', '1': 'dbcb03c474069ab994ad636be4732e35c1fefbbe206d571fb5126229b251f8e3', '2': 'a809e28394cd998808a21c71ce9e1df79c13a12b707134fe1df263bf07cc1d45'})\n" + "Transactions hashes: (3, {'0': '999da2b84011ffd6aedb966c8262804bb5280064a77f543f841e4eae96af8013', '1': '0cf69d20c599334047fb1ec9e392086a5b00a42b688dbd9728d7e979a2555622', '2': 'b2e2c5fbb4fbf9be8ec539af4cb719c5b478067eb6772fa0a47a031ef4150b5b'})\n" ] } ], @@ -2078,7 +2083,7 @@ }, { "cell_type": "code", - "execution_count": 124, + "execution_count": 64, "metadata": {}, "outputs": [ { diff --git a/multiversx_sdk/converters/transactions_converter.py b/multiversx_sdk/converters/transactions_converter.py index 13bdfef4..a074992c 100644 --- a/multiversx_sdk/converters/transactions_converter.py +++ b/multiversx_sdk/converters/transactions_converter.py @@ -33,7 +33,9 @@ def transaction_to_dictionary(self, transaction: ITransaction) -> Dict[str, Any] "options": transaction.options, "guardian": transaction.guardian, "signature": self._value_to_hex_or_empty(transaction.signature), - "guardianSignature": self._value_to_hex_or_empty(transaction.guardian_signature) + "guardianSignature": self._value_to_hex_or_empty(transaction.guardian_signature), + "relayer": transaction.relayer, + "innerTransactions": [self.transaction_to_dictionary(inner_tx) for inner_tx in transaction.inner_transactions] } def dictionary_to_transaction(self, dictionary: Dict[str, Any]) -> Transaction: @@ -54,7 +56,9 @@ def dictionary_to_transaction(self, dictionary: Dict[str, Any]) -> Transaction: version=dictionary.get("version", None), options=dictionary.get("options", None), signature=self._bytes_from_hex(dictionary.get("signature", "")), - guardian_signature=self._bytes_from_hex(dictionary.get("guardianSignature", "")) + guardian_signature=self._bytes_from_hex(dictionary.get("guardianSignature", "")), + relayer=dictionary.get("relayer", None), + inner_transactions=[self.dictionary_to_transaction(inner_tx) for inner_tx in dictionary.get("innerTransactions", [])], ) def transaction_on_network_to_outcome(self, transaction_on_network: TransactionOnNetwork) -> TransactionOutcome: diff --git a/multiversx_sdk/converters/transactions_converter_test.py b/multiversx_sdk/converters/transactions_converter_test.py index 0eeb8955..54be7994 100644 --- a/multiversx_sdk/converters/transactions_converter_test.py +++ b/multiversx_sdk/converters/transactions_converter_test.py @@ -21,30 +21,6 @@ from multiversx_sdk.network_providers.transactions import TransactionOnNetwork -class TransactionMatcher: - def __init__(self, transaction: Transaction) -> None: - self.expected = transaction - - def __eq__(self, actual: object) -> bool: - if isinstance(actual, Transaction): - return self.expected.chain_id == actual.chain_id and \ - self.expected.sender == actual.sender and \ - self.expected.receiver == actual.receiver and \ - self.expected.gas_limit == actual.gas_limit and \ - self.expected.data == actual.data and \ - self.expected.nonce == actual.nonce and \ - self.expected.value == actual.value and \ - self.expected.gas_price == actual.gas_price and \ - self.expected.sender_username == actual.sender_username and \ - self.expected.receiver_username == actual.receiver_username and \ - self.expected.version == actual.version and \ - self.expected.options == actual.options and \ - self.expected.guardian == actual.guardian and \ - self.expected.signature == actual.signature and \ - self.expected.guardian_signature == actual.guardian_signature - return False - - def test_transaction_converter(): converter = TransactionsConverter() @@ -64,7 +40,38 @@ def test_transaction_converter(): tx_as_dict = converter.transaction_to_dictionary(transaction) restored_tx = converter.dictionary_to_transaction(tx_as_dict) - assert TransactionMatcher(transaction) == restored_tx + assert transaction == restored_tx + + +def test_transaction_from_dictionary_with_inner_transaction(): + converter = TransactionsConverter() + + inner_transaction = Transaction( + nonce=90, + value=123456789000000000000000000000, + sender="erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th", + receiver="erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx", + sender_username="alice", + receiver_username="bob", + gas_limit=80000, + data=b"hello", + chain_id="localnet", + relayer="erd1k2s324ww2g0yj38qn2ch2jwctdy8mnfxep94q9arncc6xecg3xaq6mjse8" + ) + + relayed_transaction = Transaction( + nonce=77, + sender="erd1k2s324ww2g0yj38qn2ch2jwctdy8mnfxep94q9arncc6xecg3xaq6mjse8", + receiver="erd1k2s324ww2g0yj38qn2ch2jwctdy8mnfxep94q9arncc6xecg3xaq6mjse8", + gas_limit=180000, + chain_id="localnet", + inner_transactions=[inner_transaction] + ) + + tx_as_dict = converter.transaction_to_dictionary(relayed_transaction) + restored_tx = converter.dictionary_to_transaction(tx_as_dict) + + assert relayed_transaction == restored_tx def test_convert_tx_on_network_to_outcome(): diff --git a/multiversx_sdk/core/interfaces.py b/multiversx_sdk/core/interfaces.py index 3c3df606..af6a744c 100644 --- a/multiversx_sdk/core/interfaces.py +++ b/multiversx_sdk/core/interfaces.py @@ -1,4 +1,4 @@ -from typing import Optional, Protocol +from typing import Optional, Protocol, Sequence class IAddress(Protocol): @@ -25,6 +25,11 @@ class ITransaction(Protocol): guardian: str signature: bytes guardian_signature: bytes + relayer: str + + @property + def inner_transactions(self) -> Sequence["ITransaction"]: + ... class IMessage(Protocol): diff --git a/multiversx_sdk/core/proto/transaction.proto b/multiversx_sdk/core/proto/transaction.proto index 6e38de1f..c72428c4 100644 --- a/multiversx_sdk/core/proto/transaction.proto +++ b/multiversx_sdk/core/proto/transaction.proto @@ -21,4 +21,6 @@ message Transaction { uint32 Options = 13; bytes GuardAddr = 14; bytes GuardSignature = 15; + bytes Relayer = 16; + repeated Transaction InnerTransactions = 17; } diff --git a/multiversx_sdk/core/proto/transaction_pb2.py b/multiversx_sdk/core/proto/transaction_pb2.py index 35f4bad5..cc245c33 100644 --- a/multiversx_sdk/core/proto/transaction_pb2.py +++ b/multiversx_sdk/core/proto/transaction_pb2.py @@ -12,7 +12,7 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11transaction.proto\x12\x05proto\"\x9a\x02\n\x0bTransaction\x12\r\n\x05Nonce\x18\x01 \x01(\x04\x12\r\n\x05Value\x18\x02 \x01(\x0c\x12\x0f\n\x07RcvAddr\x18\x03 \x01(\x0c\x12\x13\n\x0bRcvUserName\x18\x04 \x01(\x0c\x12\x0f\n\x07SndAddr\x18\x05 \x01(\x0c\x12\x13\n\x0bSndUserName\x18\x06 \x01(\x0c\x12\x10\n\x08GasPrice\x18\x07 \x01(\x04\x12\x10\n\x08GasLimit\x18\x08 \x01(\x04\x12\x0c\n\x04\x44\x61ta\x18\t \x01(\x0c\x12\x0f\n\x07\x43hainID\x18\n \x01(\x0c\x12\x0f\n\x07Version\x18\x0b \x01(\r\x12\x11\n\tSignature\x18\x0c \x01(\x0c\x12\x0f\n\x07Options\x18\r \x01(\r\x12\x11\n\tGuardAddr\x18\x0e \x01(\x0c\x12\x16\n\x0eGuardSignature\x18\x0f \x01(\x0c\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11transaction.proto\x12\x05proto\"\xda\x02\n\x0bTransaction\x12\r\n\x05Nonce\x18\x01 \x01(\x04\x12\r\n\x05Value\x18\x02 \x01(\x0c\x12\x0f\n\x07RcvAddr\x18\x03 \x01(\x0c\x12\x13\n\x0bRcvUserName\x18\x04 \x01(\x0c\x12\x0f\n\x07SndAddr\x18\x05 \x01(\x0c\x12\x13\n\x0bSndUserName\x18\x06 \x01(\x0c\x12\x10\n\x08GasPrice\x18\x07 \x01(\x04\x12\x10\n\x08GasLimit\x18\x08 \x01(\x04\x12\x0c\n\x04\x44\x61ta\x18\t \x01(\x0c\x12\x0f\n\x07\x43hainID\x18\n \x01(\x0c\x12\x0f\n\x07Version\x18\x0b \x01(\r\x12\x11\n\tSignature\x18\x0c \x01(\x0c\x12\x0f\n\x07Options\x18\r \x01(\r\x12\x11\n\tGuardAddr\x18\x0e \x01(\x0c\x12\x16\n\x0eGuardSignature\x18\x0f \x01(\x0c\x12\x0f\n\x07Relayer\x18\x10 \x01(\x0c\x12-\n\x11InnerTransactions\x18\x11 \x03(\x0b\x32\x12.proto.Transactionb\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'transaction_pb2', globals()) @@ -20,5 +20,5 @@ DESCRIPTOR._options = None _TRANSACTION._serialized_start = 29 # pyright: ignore[reportUndefinedVariable] - _TRANSACTION._serialized_end = 311 # pyright: ignore[reportUndefinedVariable] + _TRANSACTION._serialized_end = 375 # pyright: ignore[reportUndefinedVariable] # @@protoc_insertion_point(module_scope) diff --git a/multiversx_sdk/core/proto/transaction_pb2.pyi b/multiversx_sdk/core/proto/transaction_pb2.pyi index 047a4fc8..ce06fad9 100644 --- a/multiversx_sdk/core/proto/transaction_pb2.pyi +++ b/multiversx_sdk/core/proto/transaction_pb2.pyi @@ -1,11 +1,12 @@ +from google.protobuf.internal import containers as _containers from google.protobuf import descriptor as _descriptor from google.protobuf import message as _message -from typing import ClassVar as _ClassVar, Optional as _Optional +from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union DESCRIPTOR: _descriptor.FileDescriptor class Transaction(_message.Message): - __slots__ = ["ChainID", "Data", "GasLimit", "GasPrice", "GuardAddr", "GuardSignature", "Nonce", "Options", "RcvAddr", "RcvUserName", "Signature", "SndAddr", "SndUserName", "Value", "Version"] + __slots__ = ["ChainID", "Data", "GasLimit", "GasPrice", "GuardAddr", "GuardSignature", "InnerTransactions", "Nonce", "Options", "RcvAddr", "RcvUserName", "Relayer", "Signature", "SndAddr", "SndUserName", "Value", "Version"] CHAINID_FIELD_NUMBER: _ClassVar[int] ChainID: bytes DATA_FIELD_NUMBER: _ClassVar[int] @@ -18,14 +19,18 @@ class Transaction(_message.Message): GasPrice: int GuardAddr: bytes GuardSignature: bytes + INNERTRANSACTIONS_FIELD_NUMBER: _ClassVar[int] + InnerTransactions: _containers.RepeatedCompositeFieldContainer[Transaction] NONCE_FIELD_NUMBER: _ClassVar[int] Nonce: int OPTIONS_FIELD_NUMBER: _ClassVar[int] Options: int RCVADDR_FIELD_NUMBER: _ClassVar[int] RCVUSERNAME_FIELD_NUMBER: _ClassVar[int] + RELAYER_FIELD_NUMBER: _ClassVar[int] RcvAddr: bytes RcvUserName: bytes + Relayer: bytes SIGNATURE_FIELD_NUMBER: _ClassVar[int] SNDADDR_FIELD_NUMBER: _ClassVar[int] SNDUSERNAME_FIELD_NUMBER: _ClassVar[int] @@ -36,4 +41,4 @@ class Transaction(_message.Message): VERSION_FIELD_NUMBER: _ClassVar[int] Value: bytes Version: int - def __init__(self, Nonce: _Optional[int] = ..., Value: _Optional[bytes] = ..., RcvAddr: _Optional[bytes] = ..., RcvUserName: _Optional[bytes] = ..., SndAddr: _Optional[bytes] = ..., SndUserName: _Optional[bytes] = ..., GasPrice: _Optional[int] = ..., GasLimit: _Optional[int] = ..., Data: _Optional[bytes] = ..., ChainID: _Optional[bytes] = ..., Version: _Optional[int] = ..., Signature: _Optional[bytes] = ..., Options: _Optional[int] = ..., GuardAddr: _Optional[bytes] = ..., GuardSignature: _Optional[bytes] = ...) -> None: ... + def __init__(self, Nonce: _Optional[int] = ..., Value: _Optional[bytes] = ..., RcvAddr: _Optional[bytes] = ..., RcvUserName: _Optional[bytes] = ..., SndAddr: _Optional[bytes] = ..., SndUserName: _Optional[bytes] = ..., GasPrice: _Optional[int] = ..., GasLimit: _Optional[int] = ..., Data: _Optional[bytes] = ..., ChainID: _Optional[bytes] = ..., Version: _Optional[int] = ..., Signature: _Optional[bytes] = ..., Options: _Optional[int] = ..., GuardAddr: _Optional[bytes] = ..., GuardSignature: _Optional[bytes] = ..., Relayer: _Optional[bytes] = ..., InnerTransactions: _Optional[_Iterable[_Union[Transaction, _Mapping]]] = ...) -> None: ... # pyright: ignore diff --git a/multiversx_sdk/core/proto/transaction_serializer.py b/multiversx_sdk/core/proto/transaction_serializer.py index 652331e4..070bad1e 100644 --- a/multiversx_sdk/core/proto/transaction_serializer.py +++ b/multiversx_sdk/core/proto/transaction_serializer.py @@ -1,4 +1,4 @@ -from typing import Protocol +from typing import Protocol, Sequence import multiversx_sdk.core.proto.transaction_pb2 as ProtoTransaction from multiversx_sdk.core.address import Address @@ -10,17 +10,22 @@ class ITransaction(Protocol): receiver: str gas_limit: int chain_id: str - gas_price: int - sender_username: str - receiver_username: str nonce: int value: int + sender_username: str + receiver_username: str + gas_price: int data: bytes version: int - signature: bytes options: int guardian: str + signature: bytes guardian_signature: bytes + relayer: str + + @property + def inner_transactions(self) -> Sequence["ITransaction"]: + ... class ProtoSerializer: @@ -28,6 +33,21 @@ def __init__(self) -> None: pass def serialize_transaction(self, transaction: ITransaction) -> bytes: + proto_transaction = self.convert_to_proto_message(transaction) + + encoded_tx: bytes = proto_transaction.SerializeToString() + return encoded_tx + + def serialize_transaction_value(self, tx_value: int): + if tx_value == 0: + return bytes([0, 0]) + + buffer = encode_unsigned_number(tx_value) + buffer = bytes([0x00]) + buffer + + return buffer + + def convert_to_proto_message(self, transaction: ITransaction) -> ProtoTransaction.Transaction: receiver_pubkey = Address.new_from_bech32(transaction.receiver).get_public_key() sender_pubkey = Address.new_from_bech32(transaction.sender).get_public_key() @@ -51,15 +71,10 @@ def serialize_transaction(self, transaction: ITransaction) -> bytes: proto_transaction.GuardAddr = Address.new_from_bech32(guardian_address).get_public_key() proto_transaction.GuardSignature = transaction.guardian_signature - encoded_tx: bytes = proto_transaction.SerializeToString() - - return encoded_tx - - def serialize_transaction_value(self, tx_value: int): - if tx_value == 0: - return bytes([0, 0]) + if transaction.relayer != "": + proto_transaction.Relayer = Address.new_from_bech32(transaction.relayer).get_public_key() - buffer = encode_unsigned_number(tx_value) - buffer = bytes([0x00]) + buffer + proto_transaction.InnerTransactions.extend( + [self.convert_to_proto_message(inner_tx) for inner_tx in transaction.inner_transactions]) - return buffer + return proto_transaction diff --git a/multiversx_sdk/core/proto/transaction_serializer_test.py b/multiversx_sdk/core/proto/transaction_serializer_test.py index 1ec470a9..b6ec0386 100644 --- a/multiversx_sdk/core/proto/transaction_serializer_test.py +++ b/multiversx_sdk/core/proto/transaction_serializer_test.py @@ -86,3 +86,34 @@ def test_serialized_tx_with_usernames(self): serialized_transaction = self.proto_serializer.serialize_transaction(transaction) assert serialized_transaction.hex() == "08cc011209000de0b6b3a76400001a200139472eff6886771a982f3083da5d421f24c29181e63888228dc81ca60d69e12205616c6963652a20b2a11555ce521e4944e09ab17549d85b487dcd26c84b5017a39e31a3670889ba32056361726f6c388094ebdc0340d086035201545802624051e6cd78fb3ab4b53ff7ad6864df27cb4a56d70603332869d47a5cf6ea977c30e696103e41e8dddf2582996ad335229fdf4acb726564dbc1a0bc9e705b511f06" + + def test_serialized_tx_with_inner_txs(self): + inner_transaction = Transaction( + sender=self.carol.label, + receiver=self.alice.label, + gas_limit=50000, + chain_id="T", + nonce=204, + value=1000000000000000000, + sender_username="carol", + receiver_username="alice" + ) + inner_transaction.signature = self.carol.secret_key.sign(self.transaction_computer.compute_bytes_for_signing(inner_transaction)) + + relayed_transaction = Transaction( + sender=self.carol.label, + receiver=self.alice.label, + gas_limit=50000, + chain_id="T", + nonce=204, + value=1000000000000000000, + sender_username="carol", + receiver_username="alice", + relayer=self.carol.label, + inner_transactions=[inner_transaction] + ) + + relayed_transaction.signature = self.carol.secret_key.sign(self.transaction_computer.compute_bytes_for_signing( + relayed_transaction)) + serialized_transaction = self.proto_serializer.serialize_transaction(relayed_transaction) + assert serialized_transaction.hex() == "08cc011209000de0b6b3a76400001a200139472eff6886771a982f3083da5d421f24c29181e63888228dc81ca60d69e12205616c6963652a20b2a11555ce521e4944e09ab17549d85b487dcd26c84b5017a39e31a3670889ba32056361726f6c388094ebdc0340d0860352015458026240901a6a974d6ab36546e7881c6e0364ec4c61a891aa70e5eb60f818d6c92a39cfa0beac6fab73f503853cfe8fe6149b4be207ddb93788f8450d75a07fa8759d06820120b2a11555ce521e4944e09ab17549d85b487dcd26c84b5017a39e31a3670889ba8a01b10108cc011209000de0b6b3a76400001a200139472eff6886771a982f3083da5d421f24c29181e63888228dc81ca60d69e12205616c6963652a20b2a11555ce521e4944e09ab17549d85b487dcd26c84b5017a39e31a3670889ba32056361726f6c388094ebdc0340d086035201545802624051e6cd78fb3ab4b53ff7ad6864df27cb4a56d70603332869d47a5cf6ea977c30e696103e41e8dddf2582996ad335229fdf4acb726564dbc1a0bc9e705b511f06" diff --git a/multiversx_sdk/core/transaction.py b/multiversx_sdk/core/transaction.py index 0f87e289..103fe65a 100644 --- a/multiversx_sdk/core/transaction.py +++ b/multiversx_sdk/core/transaction.py @@ -1,8 +1,9 @@ -from typing import Optional +from typing import Optional, Sequence from multiversx_sdk.core.constants import (TRANSACTION_MIN_GAS_PRICE, TRANSACTION_OPTIONS_DEFAULT, TRANSACTION_VERSION_DEFAULT) +from multiversx_sdk.core.interfaces import ITransaction class Transaction: @@ -21,7 +22,9 @@ def __init__(self, options: Optional[int] = None, guardian: Optional[str] = None, signature: Optional[bytes] = None, - guardian_signature: Optional[bytes] = None) -> None: + guardian_signature: Optional[bytes] = None, + relayer: Optional[str] = None, + inner_transactions: Optional[Sequence[ITransaction]] = None) -> None: self.chain_id = chain_id self.sender = sender self.receiver = receiver @@ -41,6 +44,8 @@ def __init__(self, self.guardian = guardian or "" self.guardian_signature = guardian_signature or bytes() + self.relayer = relayer or "" + self.inner_transactions = inner_transactions or [] def __eq__(self, other: object) -> bool: if not isinstance(other, Transaction): diff --git a/multiversx_sdk/core/transaction_builders/relayed_v1_builder.py b/multiversx_sdk/core/transaction_builders/relayed_v1_builder.py index 664515dd..7cf7a3ed 100644 --- a/multiversx_sdk/core/transaction_builders/relayed_v1_builder.py +++ b/multiversx_sdk/core/transaction_builders/relayed_v1_builder.py @@ -134,3 +134,4 @@ def _prepare_inner_transaction(self) -> str: tx[f"rcvUserName"] = base64.b64encode(self.inner_transaction.receiver_username.encode()).decode() return json.dumps(tx, separators=(",", ":")) + diff --git a/multiversx_sdk/core/transaction_computer.py b/multiversx_sdk/core/transaction_computer.py index 4b34b1b0..3f179d5b 100644 --- a/multiversx_sdk/core/transaction_computer.py +++ b/multiversx_sdk/core/transaction_computer.py @@ -91,7 +91,7 @@ def _ensure_fields(self, transaction: ITransaction) -> None: if self.has_options_set_for_guarded_transaction(transaction) or self.has_options_set_for_hash_signing(transaction): raise BadUsageError(f"Non-empty transaction options requires transaction version >= {MIN_TRANSACTION_VERSION_THAT_SUPPORTS_OPTIONS}") - def _to_dictionary(self, transaction: ITransaction) -> Dict[str, Any]: + def _to_dictionary(self, transaction: ITransaction, with_signature: bool = False) -> Dict[str, Any]: dictionary: Dict[str, Any] = OrderedDict() dictionary["nonce"] = transaction.nonce dictionary["value"] = str(transaction.value) @@ -111,6 +111,10 @@ def _to_dictionary(self, transaction: ITransaction) -> Dict[str, Any]: if transaction.data: dictionary["data"] = b64encode(transaction.data).decode() + if with_signature: + if transaction.signature: + dictionary["signature"] = transaction.signature.hex() + dictionary["chainID"] = transaction.chain_id if transaction.version: @@ -122,6 +126,13 @@ def _to_dictionary(self, transaction: ITransaction) -> Dict[str, Any]: if transaction.guardian: dictionary["guardian"] = transaction.guardian + if transaction.relayer: + dictionary["relayer"] = transaction.relayer + + if len(transaction.inner_transactions): + dictionary["innerTransactions"] = \ + [self._to_dictionary(transaction=tx, with_signature=True) for tx in transaction.inner_transactions] + return dictionary def _dict_to_json(self, dictionary: Dict[str, Any]) -> bytes: diff --git a/multiversx_sdk/core/transactions_factories/delegation_transactions_factory.py b/multiversx_sdk/core/transactions_factories/delegation_transactions_factory.py index 8a704d5a..a189704c 100644 --- a/multiversx_sdk/core/transactions_factories/delegation_transactions_factory.py +++ b/multiversx_sdk/core/transactions_factories/delegation_transactions_factory.py @@ -166,7 +166,8 @@ def create_transaction_for_unstaking_nodes(self, def create_transaction_for_unjailing_nodes(self, sender: IAddress, delegation_contract: IAddress, - public_keys: Sequence[IValidatorPublicKey]) -> Transaction: + public_keys: Sequence[IValidatorPublicKey], + amount: int) -> Transaction: num_nodes = len(public_keys) parts = ["unJailNodes"] @@ -179,7 +180,8 @@ def create_transaction_for_unjailing_nodes(self, receiver=delegation_contract, data_parts=parts, gas_limit=self._compute_execution_gas_limit_for_nodes_management(num_nodes), - add_data_movement_gas=True + add_data_movement_gas=True, + amount=amount ).build() return transaction diff --git a/multiversx_sdk/core/transactions_factories/delegation_transactions_factory_test.py b/multiversx_sdk/core/transactions_factories/delegation_transactions_factory_test.py index 8cac5be4..4da77d2e 100644 --- a/multiversx_sdk/core/transactions_factories/delegation_transactions_factory_test.py +++ b/multiversx_sdk/core/transactions_factories/delegation_transactions_factory_test.py @@ -133,14 +133,15 @@ def test_create_transaction_for_unjailing_nodes(self): transaction = self.factory.create_transaction_for_unjailing_nodes( sender=sender, delegation_contract=delegation_contract, - public_keys=public_keys + public_keys=public_keys, + amount=25000000000000000000 # 2.5 egld ) assert transaction.sender == "erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2" assert transaction.receiver == "erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqtllllls002zgc" assert transaction.data assert transaction.data.decode() == "unJailNodes@6e6f746176616c6964626c736b6579686578656e636f646564" - assert transaction.value == 0 + assert transaction.value == 25000000000000000000 def test_create_transaction_for_changing_service_fee(self): sender = Address.new_from_bech32("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2") diff --git a/multiversx_sdk/core/transactions_factories/relayed_transactions_factory.py b/multiversx_sdk/core/transactions_factories/relayed_transactions_factory.py index 0bb840f7..bd6df817 100644 --- a/multiversx_sdk/core/transactions_factories/relayed_transactions_factory.py +++ b/multiversx_sdk/core/transactions_factories/relayed_transactions_factory.py @@ -1,6 +1,6 @@ import base64 import json -from typing import Any, Dict, List, Protocol +from typing import Any, Dict, List, Protocol, Sequence from multiversx_sdk.core.address import Address from multiversx_sdk.core.errors import InvalidInnerTransactionError @@ -72,6 +72,34 @@ def create_relayed_v2_transaction(self, options=inner_transaction.options ) + def create_relayed_v3_transaction(self, + relayer_address: IAddress, + inner_transactions: Sequence[ITransaction]) -> Transaction: + if len(inner_transactions) == 0: + raise InvalidInnerTransactionError("The are no inner transactions") + + inner_txs_gas_limit = 0 + for inner_transaction in inner_transactions: + if not inner_transaction.signature: + raise InvalidInnerTransactionError("The inner transaction is not signed") + + if inner_transaction.relayer != relayer_address.to_bech32(): + raise InvalidInnerTransactionError("The inner transaction has an incorrect relayer address") + + inner_txs_gas_limit += inner_transaction.gas_limit + + move_balances_gas = self._config.min_gas_limit * len(inner_transactions) + gas_limit = self._config.min_gas_limit + move_balances_gas + inner_txs_gas_limit + + return Transaction( + sender=relayer_address.to_bech32(), + receiver=relayer_address.to_bech32(), + value=0, + gas_limit=gas_limit, + chain_id=self._config.chain_id, + inner_transactions=inner_transactions, + ) + def _prepare_inner_transaction_for_relayed_v1(self, inner_transaction: ITransaction) -> str: sender = Address.new_from_bech32(inner_transaction.sender).to_hex() receiver = Address.new_from_bech32(inner_transaction.receiver).to_hex() diff --git a/multiversx_sdk/core/transactions_factories/relayed_transactions_factory_test.py b/multiversx_sdk/core/transactions_factories/relayed_transactions_factory_test.py index 056cf1e9..b0797f84 100644 --- a/multiversx_sdk/core/transactions_factories/relayed_transactions_factory_test.py +++ b/multiversx_sdk/core/transactions_factories/relayed_transactions_factory_test.py @@ -1,3 +1,5 @@ +from typing import List + import pytest from multiversx_sdk.core.address import Address @@ -231,3 +233,75 @@ def test_compute_relayed_v2_transaction(self): assert relayed_transaction.options == 0 assert relayed_transaction.gas_limit == 60414500 assert relayed_transaction.data.decode() == "relayedTxV2@000000000000000000010000000000000000000000000000000000000002ffff@0f@676574436f6e7472616374436f6e666967@fc3ed87a51ee659f937c1a1ed11c1ae677e99629fae9cc289461f033e6514d1a8cfad1144ae9c1b70f28554d196bd6ba1604240c1c1dc19c959e96c1c3b62d0c" + + def test_compute_relayed_v3_transaction(self): + alice = self.wallets["alice"] + bob = self.wallets["bob"] + + inner_transaction = Transaction( + sender=bob.label, + receiver=bob.label, + gas_limit=50000, + chain_id="T", + nonce=0, + version=2, + relayer=alice.label + ) + + inner_transactions = [inner_transaction] + serialized_inner_transaction = self.transaction_computer.compute_bytes_for_signing(inner_transaction) + inner_transaction.signature = bob.secret_key.sign(serialized_inner_transaction) + + relayed_transaction = self.factory.create_relayed_v3_transaction( + relayer_address=Address.from_bech32(alice.label), + inner_transactions=inner_transactions + ) + serialized_relayed_transaction = self.transaction_computer.compute_bytes_for_signing(relayed_transaction) + relayed_transaction.signature = alice.secret_key.sign(serialized_relayed_transaction) + assert relayed_transaction.signature.hex() == "6bd446e1f531db190de97adeab7bae3ed332a83d93e47dc29299a0a6868b966b002d0f4395eee450fc89c7677516d7448c6d01245a3fc5c6c65e0bf8dca9540e" + assert relayed_transaction.gas_limit == 150000 + + def test_create_relayed_v3_with_invalid_inner_tx(self): + alice = self.wallets["alice"] + bob = self.wallets["bob"] + + inner_transaction = Transaction( + sender=bob.label, + receiver="erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx", + gas_limit=2500, + chain_id="local-testnet", + nonce=0, + version=2, + relayer="erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx" + ) + + serialized_inner_transaction = self.transaction_computer.compute_bytes_for_signing(inner_transaction) + inner_transaction.signature = bob.secret_key.sign(serialized_inner_transaction) + + inner_transactions = [inner_transaction] + + """ + In the inner tx, the relayer address is acutally bob's. The creation should fail + """ + with pytest.raises(InvalidInnerTransactionError) as err: + self.factory.create_relayed_v3_transaction( + relayer_address=Address.from_bech32(alice.label), + inner_transactions=inner_transactions + ) + assert str(err.value) == "The inner transaction has an incorrect relayer address" + + inner_transaction.signature = b"" + with pytest.raises(InvalidInnerTransactionError) as err: + self.factory.create_relayed_v3_transaction( + relayer_address=Address.from_bech32(alice.label), + inner_transactions=inner_transactions + ) + assert str(err.value) == "The inner transaction is not signed" + + inner_transactions: List[Transaction] = [] + with pytest.raises(InvalidInnerTransactionError) as err: + self.factory.create_relayed_v3_transaction( + relayer_address=Address.from_bech32(alice.label), + inner_transactions=inner_transactions + ) + assert str(err.value) == "The are no inner transactions" diff --git a/multiversx_sdk/network_providers/transactions.py b/multiversx_sdk/network_providers/transactions.py index a03264d9..661be9f8 100644 --- a/multiversx_sdk/network_providers/transactions.py +++ b/multiversx_sdk/network_providers/transactions.py @@ -1,5 +1,5 @@ import base64 -from typing import Any, Dict, Optional, Protocol +from typing import Any, Dict, Optional, Protocol, Sequence from multiversx_sdk.core.address import Address from multiversx_sdk.network_providers.contract_results import ContractResults @@ -28,6 +28,11 @@ class ITransaction(Protocol): guardian: str signature: bytes guardian_signature: bytes + relayer: str + + @property + def inner_transactions(self) -> Sequence["ITransaction"]: + ... class TransactionOnNetwork: