public SearchResult Search(SearchParameter param)
        {
            CheckParameter(param != null, "param is required");

            return(DoSearch(param).Wait());
        }
        private SearchResultItem ConvertToResultItemIfMatchingCriteria(Transaction transaction, SearchParameter param)
        {
            if (transaction is TransferTransaction)
            {
                try
                {
                    var messagePayload = RetrieveProximaxMessagePayloadService.GetMessagePayload(
                        transaction as TransferTransaction, param.AccountPrivateKey);

                    // verify message payload is upload transaction by having the right json fields
                    if (messagePayload?.Version != null &&
                        messagePayload.PrivacyType != 0 &&
                        messagePayload.Data != null &&
                        messagePayload.Data.Timestamp != 0 &&
                        messagePayload.Data.DataHash != null)
                    {
                        if (MatchesSearchCriteria(messagePayload,
                                                  param.NameFilter,
                                                  param.DescriptionFilter,
                                                  param.MetadataKeyFilter,
                                                  param.MetadataValueFilter))
                        {
                            return(new SearchResultItem(
                                       transaction.TransactionInfo.Hash,
                                       transaction.TransactionInfo.Id,
                                       messagePayload));
                        }
                    }
                }
                catch (Exception)
                {
                    // skip transaction
                }
            }

            return(null);
        }