//[Fact] //replace private keys to avoid issues

        public async void ShouldTransferTokensUsingARelayer()
        {
            //gnosis safe owner private key (only one in this scenario)
            var walletOwnerPrivateKey = "0xcf0d584dba3902252f3762d5161c4996f4b364e6e79a75c96b2e2c3e";

            //relayer or account that is going to send the transaction (no relation to the gnosis safe)
            //pays the transaction
            var accountRelayerReceiverPrivateKey = "0xa261c1c7f775c3423be58cdb8c24c6e29f898af56e8699107aa2";
            var chainId = Chain.Rinkeby;

            var gnosisSafeAddress = "0xa9C09412C1d93DAc6eE9254A51E97454588D3B88";
            //contract address of the dai
            var daiAddress = "0x6a9865ade2b6207daac49f8bcba9705deb0b0e6d";

            var accountRelayerReceiver = new Account(accountRelayerReceiverPrivateKey, chainId);

            var web3Url = _ethereumClientIntegrationFixture.GetInfuraUrl(InfuraNetwork.Rinkeby);
            var web3    = new Web3.Web3(accountRelayerReceiver, web3Url);

            var service = new GnosisSafeService(web3, gnosisSafeAddress);

            var transfer = new TransferFunction()
            {
                To    = accountRelayerReceiver.Address,
                Value = Web3.Web3.Convert.ToWei(1)
            };

            var gasPrice = await web3.Eth.GasPrice.SendRequestAsync();

            var execTransactionFunction = await service.BuildTransactionAsync(
                new EncodeTransactionDataFunction()
            {
                To = daiAddress
            }, transfer, (int)chainId, false,
                walletOwnerPrivateKey);

            //legacy
            execTransactionFunction.GasPrice = gasPrice;
            var tokenService  = new StandardTokenEIP20.StandardTokenService(web3, daiAddress);
            var balanceBefore = await tokenService.BalanceOfQueryAsync(accountRelayerReceiver.Address);



            var receipt = await service.ExecTransactionRequestAndWaitForReceiptAsync(execTransactionFunction);

            Assert.False(receipt.HasErrors());
            var balanceAfter = await tokenService.BalanceOfQueryAsync(accountRelayerReceiver.Address);

            Assert.Equal(Web3.Web3.Convert.FromWei(balanceBefore) + 1, Web3.Web3.Convert.FromWei(balanceAfter));
        }
        //[Fact] //replace private keys to avoid issues
        public async void ShouldDoMultiTransferTokensUsingARelayer()
        {
            var walletOwnerPrivateKey            = "0xcf0d584dba3902252f3762d5161c4996f4b364e6e79a75c96b2e2c3e3";
            var accountRelayerReceiverPrivateKey = "0xa261c1c7f775c3423be58cdb8c24c6e29f898af56e8699107aa219a0";
            var chainId           = Chain.Rinkeby;
            var gnosisSafeAddress = "0xa9C09412C1d93DAc6eE9254A51E97454588D3B88";
            var daiAddress        = "0x6a9865ade2b6207daac49f8bcba9705deb0b0e6d";
            var multiSendAddress  = "0x40A2aCCbd92BCA938b02010E17A5b8929b49130D";

            var accountRelayerReceiver = new Account(accountRelayerReceiverPrivateKey, chainId);

            var web3Url = _ethereumClientIntegrationFixture.GetInfuraUrl(InfuraNetwork.Rinkeby);
            var web3    = new Web3.Web3(accountRelayerReceiver, web3Url);
            var service = new GnosisSafeService(web3, gnosisSafeAddress);

            var transfer = new TransferFunction()
            {
                To    = accountRelayerReceiver.Address,
                Value = Web3.Web3.Convert.ToWei(1)
            };


            var gasPrice = await web3.Eth.GasPrice.SendRequestAsync();

            var execTransactionFunction = await service.BuildMultiSendTransactionAsync(
                new EncodeTransactionDataFunction()
            {
                To = multiSendAddress
            }, (int)chainId, walletOwnerPrivateKey, false,
                new MultiSendFunctionInput <TransferFunction>(transfer, daiAddress),
                new MultiSendFunctionInput <TransferFunction>(transfer, daiAddress)
                );

            //legacy
            execTransactionFunction.GasPrice = gasPrice;
            var tokenService  = new StandardTokenEIP20.StandardTokenService(web3, daiAddress);
            var balanceBefore = await tokenService.BalanceOfQueryAsync(accountRelayerReceiver.Address);



            var receipt = await service.ExecTransactionRequestAndWaitForReceiptAsync(execTransactionFunction);

            Assert.False(receipt.HasErrors());
            var balanceAfter = await tokenService.BalanceOfQueryAsync(accountRelayerReceiver.Address);

            Assert.Equal(Web3.Web3.Convert.FromWei(balanceBefore) + 2, Web3.Web3.Convert.FromWei(balanceAfter));
        }