public async Task ExecuteOperationAsync(
            string operationId,
            string masterWalletAddress,
            string targetWalletAddress,
            string encodedData)
        {
            var(transactionData, transactionHash) = await _operationsRepository.GetOrCreateOperationAsync(operationId);

            if (transactionHash == null)
            {
                if (transactionData == null) // Transaction has been neither built, nor broadcasted
                {
                    transactionData = await BuildTransactionAsync(operationId, masterWalletAddress, targetWalletAddress, encodedData);
                }

                // Transaction has already been built, but has not been broadcasted yet
                var broadcastedData = await SendTransactionAsync(operationId, transactionData);

                await SetTransactionHash(operationId, broadcastedData.Item2);

                return;
            }

            //Transaction has already been built and broadcasted
            if (transactionData == null)
            {
                _log.Warning("Operation has hash, but has no data.", context: new { operationId });
                return;
            }

            _log.Info("Operation has already been built and broadcasted.", new { operationId, transactionHash });
        }