1919 UserSigner )
2020from multiversx_sdk .abi import (AddressValue , BigUIntValue , BytesValue ,
2121 I32Value , I64Value , Serializer , StringValue ,
22- U32Value )
22+ TokenIdentifierValue , U32Value )
2323from multiversx_sdk .core .address import get_shard_of_pubkey
2424
2525from systemtests .config import CONFIGURATIONS , Configuration
@@ -96,6 +96,10 @@ def do_run(args: Any):
9696
9797 controller .wait_until_epoch (configuration .activation_epoch_relayed_v3 )
9898
99+ do_run_relayed_builtin_functions (memento , accounts , controller )
100+ # TODO: integrate "do_run_relayed_builtin_functions" into main flow.
101+ return
102+
99103 print ("## Intra-shard, simple MoveBalance with refund" )
100104 controller .send (controller .create_transfer (
101105 sender = accounts .get_user (shard = SOME_SHARD , index = 0 ),
@@ -876,6 +880,162 @@ def do_run(args: Any):
876880 memento .replace_run_transactions (controller .transactions_hashes_accumulator )
877881
878882
883+ def do_run_relayed_builtin_functions (memento : "Memento" , accounts : "BunchOfAccounts" , controller : "Controller" ):
884+ named_accounts = {
885+ "sponsor" : accounts .sponsor ,
886+ "a" : accounts .get_user (shard = 0 , index = 0 ),
887+ "b" : accounts .get_user (shard = 0 , index = 1 ),
888+ "c" : accounts .get_user (shard = 0 , index = 2 ),
889+ "m" : accounts .get_user (shard = 1 , index = 0 ),
890+ "n" : accounts .get_user (shard = 1 , index = 1 ),
891+ "p" : accounts .get_user (shard = 1 , index = 2 ),
892+ }
893+
894+ named_contracts = {
895+ # Owned by "a".
896+ "x" : accounts .get_contract_address ("dummy" , shard = 0 , index = 0 ),
897+ # Ownership transferred to "a".
898+ "y" : accounts .get_contract_address ("dummy" , shard = 1 , index = 0 ),
899+ }
900+
901+ custom_token = Token (memento .get_custom_currencies ()[0 ])
902+
903+ # Ownership transferred to "a".
904+ controller .do_change_contract_owner (contract = named_contracts ["y" ], new_owner = named_accounts ["a" ])
905+
906+ # BuiltInFunctionClaimDeveloperRewards
907+
908+ for (sender , contract , relayer ) in [("a" , "x" , "a" ), ("a" , "x" , "b" ), ("a" , "y" , "a" ), ("a" , "y" , "b" )]:
909+ print (f"## BuiltInFunctionClaimDeveloperRewards, sender={ sender } , contract={ contract } , relayer={ relayer } " )
910+
911+ controller .send (controller .create_transfer_and_execute (
912+ sender = named_accounts [sender ],
913+ contract = named_contracts [contract ],
914+ function = "ClaimDeveloperRewards" ,
915+ arguments = [],
916+ gas_limit = 6_000_000 ,
917+ native_amount = 0 ,
918+ custom_amount = 0 ,
919+ relayer = named_accounts [relayer ],
920+ ), await_processing_started = True )
921+
922+ # BuiltInFunctionChangeOwnerAddress
923+
924+ for (sender , contract , relayer ) in [("a" , "x" , "b" ), ("a" , "x" , "a" ), ("a" , "y" , "b" ), ("a" , "y" , "a" )]:
925+ print (f"## BuiltInFunctionChangeOwnerAddress, sender={ sender } , contract={ contract } , relayer={ relayer } " )
926+
927+ controller .send (controller .create_transfer_and_execute (
928+ sender = named_accounts [sender ],
929+ contract = named_contracts [contract ],
930+ function = "ChangeOwnerAddress" ,
931+ # Keep "a" as the owner.
932+ arguments = [AddressValue .new_from_address (named_accounts ["a" ].address )],
933+ gas_limit = 6_000_000 ,
934+ native_amount = 0 ,
935+ custom_amount = 0 ,
936+ relayer = named_accounts [relayer ],
937+ ), await_processing_started = True )
938+
939+ # BuiltInFunctionSetUserName
940+
941+ for (sender , relayer ) in [("a" , "a" ), ("a" , "b" )]:
942+ print (f"## BuiltInFunctionSetUserName, sender={ sender } , relayer={ relayer } " )
943+
944+ controller .send (controller .create_transfer_and_execute (
945+ sender = named_accounts [sender ],
946+ contract = Address .new_from_bech32 ("erd1qqqqqqqqqqqqqpgqx4ca3eu4k6w63hl8pjjyq2cp7ul7a4ukqz0skq6fxj" ),
947+ function = "SetUserName" ,
948+ arguments = [StringValue ("test.elrond" )],
949+ gas_limit = 6_000_000 ,
950+ native_amount = 0 ,
951+ custom_amount = 0 ,
952+ relayer = named_accounts [relayer ],
953+ ), await_processing_started = True )
954+
955+ # BuiltInFunctionSaveKeyValue
956+
957+ for (sender , relayer ) in [("a" , "a" ), ("b" , "b" )]:
958+ print (f"## BuiltInFunctionSaveKeyValue, sender={ sender } , relayer={ relayer } " )
959+
960+ controller .send (controller .create_transfer_and_execute (
961+ sender = named_accounts [sender ],
962+ contract = named_accounts [sender ].address ,
963+ function = "SaveKeyValue" ,
964+ arguments = [StringValue ("test" ), StringValue ("test" )],
965+ gas_limit = 1_000_000 ,
966+ native_amount = 0 ,
967+ custom_amount = 0 ,
968+ relayer = named_accounts [relayer ],
969+ ), await_processing_started = True )
970+
971+ # BuiltInFunctionESDTTransfer
972+
973+ for (sender , receiver , relayer ) in [
974+ ("a" , "b" , "c" ), ("a" , "a" , "c" ), ("a" , "b" , "b" ), ("a" , "a" , "a" ),
975+ ("a" , "m" , "c" ), ("a" , "m" , "a" )
976+ ]:
977+ print (f"## BuiltInFunctionESDTTransfer, sender={ sender } , receiver={ receiver } , relayer={ relayer } " )
978+
979+ controller .send (controller .create_transfer (
980+ sender = named_accounts [sender ],
981+ receiver = named_accounts [receiver ].address ,
982+ native_amount = 0 ,
983+ custom_amount = 43 ,
984+ additional_gas_limit = 0 ,
985+ relayer = named_accounts [relayer ],
986+ ), await_completion = True )
987+
988+ # BuiltInFunctionESDTBurn / BuiltInFunctionESDTLocalBurn
989+
990+ for (sender , relayer ) in [("a" , "b" ), ("a" , "a" )]:
991+ print (f"## BuiltInFunctionESDTBurn, sender={ sender } , relayer={ relayer } " )
992+
993+ controller .send (controller .create_transfer_and_execute (
994+ sender = named_accounts [sender ],
995+ contract = named_accounts [sender ].address ,
996+ function = "ESDTLocalBurn" ,
997+ arguments = [TokenIdentifierValue (custom_token .identifier ), U32Value (1 )],
998+ gas_limit = 300_000 ,
999+ native_amount = 0 ,
1000+ custom_amount = 0 ,
1001+ relayer = named_accounts [relayer ],
1002+ ), await_processing_started = True )
1003+
1004+ # BuiltInFunctionESDTFreeze
1005+
1006+ for (sender , relayer ) in [("sponsor" , "b" ), ("sponsor" , "a" )]:
1007+ print (f"## BuiltInFunctionESDTFreeze, sender={ sender } , relayer={ relayer } " )
1008+
1009+ controller .send (controller .create_transfer_and_execute (
1010+ sender = named_accounts [sender ],
1011+ contract = Address .new_from_bech32 ("erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u" ),
1012+ function = "freeze" ,
1013+ # Freeze token for "a".
1014+ arguments = [TokenIdentifierValue (custom_token .identifier ), AddressValue .new_from_address (named_accounts ["a" ].address )],
1015+ gas_limit = 70_000_000 ,
1016+ native_amount = 0 ,
1017+ custom_amount = 0 ,
1018+ relayer = named_accounts [relayer ],
1019+ ), await_completion = True )
1020+
1021+ # BuiltInFunctionESDTUnFreeze
1022+
1023+ for (sender , relayer ) in [("sponsor" , "b" ), ("sponsor" , "a" )]:
1024+ print (f"## BuiltInFunctionESDTUnFreeze, sender={ sender } , relayer={ relayer } " )
1025+
1026+ controller .send (controller .create_transfer_and_execute (
1027+ sender = named_accounts [sender ],
1028+ contract = Address .new_from_bech32 ("erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u" ),
1029+ function = "unFreeze" ,
1030+ # UnFreeze token for "a".
1031+ arguments = [TokenIdentifierValue (custom_token .identifier ), AddressValue .new_from_address (named_accounts ["a" ].address )],
1032+ gas_limit = 70_000_000 ,
1033+ native_amount = 0 ,
1034+ custom_amount = 0 ,
1035+ relayer = named_accounts [relayer ],
1036+ ), await_completion = True )
1037+
1038+
8791039class BunchOfAccounts :
8801040 def __init__ (self , configuration : Configuration , memento : "Memento" ) -> None :
8811041 self .configuration = configuration
@@ -1270,7 +1430,7 @@ def create_arbitrary_transaction(self, sender: "Account", receiver: Address, val
12701430
12711431 return transaction
12721432
1273- def create_transfer (self , sender : "Account" , receiver : Address , native_amount : int , custom_amount : int , additional_gas_limit : int = 0 ) -> Transaction :
1433+ def create_transfer (self , sender : "Account" , receiver : Address , native_amount : int , custom_amount : int , additional_gas_limit : int = 0 , relayer : Optional [ "Account" ] = None ) -> Transaction :
12741434 token_transfers : List [TokenTransfer ] = []
12751435
12761436 if custom_amount :
@@ -1286,12 +1446,19 @@ def create_transfer(self, sender: "Account", receiver: Address, native_amount: i
12861446
12871447 transaction .gas_limit += additional_gas_limit
12881448
1449+ if relayer is not None :
1450+ transaction .relayer = relayer .address
1451+ transaction .gas_limit += ADDITIONAL_GAS_LIMIT_FOR_RELAYED_V3
1452+
12891453 self .apply_nonce (transaction )
12901454 self .sign (transaction )
12911455
1456+ if relayer is not None :
1457+ self .sign_as_relayer_v3 (transaction )
1458+
12921459 return transaction
12931460
1294- def create_transfer_and_execute (self , sender : "Account" , contract : Address , function : str , arguments : list [Any ], gas_limit : int , native_amount : int , custom_amount : int ) -> Transaction :
1461+ def create_transfer_and_execute (self , sender : "Account" , contract : Address , function : str , arguments : list [Any ], gas_limit : int , native_amount : int , custom_amount : int , relayer : Optional [ "Account" ] = None ) -> Transaction :
12951462 token_transfers : List [TokenTransfer ] = []
12961463
12971464 if custom_amount :
@@ -1308,9 +1475,15 @@ def create_transfer_and_execute(self, sender: "Account", contract: Address, func
13081475 token_transfers = token_transfers
13091476 )
13101477
1478+ if relayer is not None :
1479+ transaction .relayer = relayer .address
1480+
13111481 self .apply_nonce (transaction )
13121482 self .sign (transaction )
13131483
1484+ if relayer is not None :
1485+ self .sign_as_relayer_v3 (transaction )
1486+
13141487 return transaction
13151488
13161489 def create_contract_deployment (self , sender : "Account" , bytecode : Path , arguments : list [Any ], gas_limit : int , amount : int ) -> Transaction :
0 commit comments