/// <summary>
        ///     ToSecretProofTransaction
        /// </summary>
        /// <param name="tx"></param>
        /// <param name="txInfo"></param>
        /// <returns></returns>
        private static SecretProofTransaction ToSecretProofTransaction(JObject tx, TransactionInfo txInfo)
        {
            var transaction = tx["transaction"].ToObject <JObject>();
            var version     = transaction["version"];

            //Bug - It seems the dotnetcore does not
            //understand the Integer.
            //The workaround it to double cast the version
            int versionValue;

            try
            {
                versionValue = (int)((uint)version);
            }
            catch (Exception)
            {
                versionValue = (int)version;
            }
            var network   = TransactionMappingUtils.ExtractNetworkType(versionValue);
            var txVersion = TransactionMappingUtils.ExtractTransactionVersion(versionValue);
            var deadline  = new Deadline(transaction["deadline"].ToObject <UInt64DTO>().ToUInt64());
            var maxFee    = transaction["maxFee"]?.ToObject <UInt64DTO>().ToUInt64();
            var signature = transaction["signature"].ToObject <string>();
            var signer    = new PublicAccount(transaction["signer"].ToObject <string>(), network);
            var recipient = Recipient.From(Address.CreateFromHex(transaction["recipient"].ToObject <string>()));
            var hashType  = HashTypeExtension.GetRawValue(transaction["hashAlgorithm"].ToObject <int>());
            var secret    = transaction["secret"].ToObject <string>();
            var proof     = transaction["proof"].ToObject <string>();

            return(new SecretProofTransaction(
                       network, txVersion, deadline, maxFee, hashType, recipient, secret,
                       proof, signature, signer, txInfo));
        }
        /// <summary>
        /// Get composite hash
        /// </summary>
        /// <param name="hash">The composite hash.</param>
        /// <returns>IObservable&lt;List&lt;SecretLockWithMetaInfo&gt;&gt;</returns>
        public IObservable <List <SecretLockWithMetaInfo> > GetCompositeHash(string hash)
        {
            HashTypeExtension.GetRawValue(1);

            var route = $"{BasePath}/lock/compositeHash/{hash}";

            return(Observable.FromAsync(async ar => await route.GetJsonAsync <List <SecretLockWithMeta> >())
                   .Select(i => i.Select(info => new SecretLockWithMetaInfo(
                                             new MetaLock(info.Meta.id), new SecretLockInfo(info.Lock.Account, info.Lock.AccountAddress, info.Lock.MosaicId.ToUInt64(), info.Lock.Amount.ToUInt64(), info.Lock.Height.ToUInt64(), info.Lock.Status, HashTypeExtension.GetRawValue((int)info.Lock.HashAlgorithm), info.Lock.Secret, info.Lock.Recipient, info.Lock.CompositeHash)
                                             )).ToList()));
        }
        /// <summary>
        /// Get account secret hash
        /// </summary>
        /// <param name="account">The public account.</param>
        /// <returns>IObservable&lt;List&lt;SecretLockWithMetaInfo&gt;&gt;</returns>
        public IObservable <List <SecretLockWithMetaInfo> > GetAccountSecretLockHash(PublicAccount account)
        {
            Guard.NotNull(account, nameof(account), "Public account should not be null");
            var route = $"{BasePath}/account/{account.PublicKey}/lock/secret";

            return(Observable.FromAsync(async ar => await route.GetJsonAsync <List <SecretLockWithMeta> >())
                   .Select(i => i.Select(info => new SecretLockWithMetaInfo(
                                             new MetaLock(info.Meta.id), new SecretLockInfo(info.Lock.Account, info.Lock.AccountAddress, info.Lock.MosaicId.ToUInt64(), info.Lock.Amount.ToUInt64(), info.Lock.Height.ToUInt64(), info.Lock.Status, HashTypeExtension.GetRawValue((int)info.Lock.HashAlgorithm), info.Lock.Secret, info.Lock.Recipient, info.Lock.CompositeHash)
                                             )).ToList()));
        }