/// <summary>
        /// Adds token to plasma network
        /// </summary>
        /// <param name="web3">web3 interface</param>
        /// <param name="address">sender address</param>
        /// <param name="tokenAddress">token address</param>
        /// <returns></returns>
        public async Task <Nethereum.Signer.Transaction> AddToken(Web3 web3, string address, string tokenAddress)
        {
            var function = GetFunctionAddToken();

            return(await ContractHelper.CreateTransaction(web3, address,
                                                          function,
                                                          tokenAddress));
        }
        /// <summary>
        /// Creates transaction of ERC20 deposit to rootchain (caller must be token owner)
        /// </summary>
        /// <param name="web3">web3 interface</param>
        /// <param name="address">sender address</param>
        /// <param name="depositTx">deposit transaction data</param>
        /// <returns></returns>
        public async Task <Nethereum.Signer.Transaction> DepositToken(Web3 web3, string address, byte[] depositTx)
        {
            var function = GetFunctionDepositFrom();

            return(await ContractHelper.CreateTransaction(web3, address,
                                                          function,
                                                          depositTx));
        }
        /// <summary>
        /// Creates transaction of ETH deposit to root chain
        /// </summary>
        /// <param name="web3">web3 interface</param>
        /// <param name="address">sender address</param>
        /// <param name="depositTx">deposit transaction data</param>
        /// <param name="amount">amount of deposit</param>
        /// <returns></returns>
        public async Task <Nethereum.Signer.Transaction> Deposit(Web3 web3, string address, byte[] depositTx, BigInteger amount)
        {
            var function = GetFunctionDeposit();

            return(await ContractHelper.CreateTransaction(web3, address,
                                                          amount,
                                                          function,
                                                          depositTx));
        }
        /// <summary>
        /// Creates transaction of exit process to root chain
        /// </summary>
        /// <param name="web3">web3 interface</param>
        /// <param name="address">sender address</param>
        /// <param name="currency">transaction currency</param>
        /// <param name="topUtxoPosition">starting index of exit</param>
        /// <param name="exitsToProcess">number exits to process</param>
        /// <returns></returns>
        public async Task <Nethereum.Signer.Transaction> ProcessExits(Web3 web3, string address, string currency, BigInteger topUtxoPosition, BigInteger exitsToProcess)
        {
            var function = GetFunctionProcessExits();

            return(await ContractHelper.CreateTransaction(web3, address,
                                                          function,
                                                          currency,
                                                          topUtxoPosition,
                                                          exitsToProcess));
        }
        /// <summary>
        /// Creates transaction of standard exit from child chain to root chain
        /// </summary>
        /// <param name="web3">web3 interface</param>
        /// <param name="address">sender address</param>
        /// <param name="exitData">exit data for a given utxo</param>
        /// <param name="exitBond">exit bond value (optional)</param>
        /// <returns></returns>
        public async Task <Nethereum.Signer.Transaction> StartStandardExit(Web3 web3, string address, ExitData exitData, BigInteger?exitBond = null)
        {
            var function = GetFunctionStartStandardExit();

            return(await ContractHelper.CreateTransaction(web3, address,
                                                          exitBond.HasValue?exitBond.Value : STANDARD_EXIT_BOND,
                                                          function,
                                                          exitData.Position,
                                                          exitData.TxBytes.HexToByteArray(),
                                                          exitData.Proof.HexToByteArray()));
        }
        /// <summary>
        /// Challenges a standard exit
        /// </summary>
        /// <param name="web3">web3 interface</param>
        /// <param name="address">sender address</param>
        /// <param name="challengeData">challenge data</param>
        /// <returns></returns>
        public async Task <Nethereum.Signer.Transaction> ChallengeStandardExit(Web3 web3, string address, ChallengeData challengeData)
        {
            var function = GetFunctionChallengeStandardExit();

            return(await ContractHelper.CreateTransaction(web3, address,
                                                          function,
                                                          challengeData.ExitId,
                                                          challengeData.TxBytes.HexToByteArray(),
                                                          challengeData.InputIndex,
                                                          challengeData.Signature.HexToByteArray()));
        }