public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var transaction = GetTransactionType(objectType); if (reader.TokenType != JsonToken.StartObject) { throw new ArgumentException("Invalid token type, must be StartObject"); } var jObject = JObject.Load(reader); var attachmentJobject = jObject.SelectToken(Parameters.Attachment) as JObject; var attachmentConverter = new AttachmentConverter(attachmentJobject); var typeByte = GetValueOrDefault(jObject, Parameters.Type, Convert.ToByte); var subTypeByte = GetValueOrDefault(jObject, Parameters.SubType, Convert.ToByte); var type = TransactionTypeMapper.GetMainType(typeByte); var subType = TransactionTypeMapper.GetSubType(typeByte, subTypeByte); transaction.Amount = GetValueOrDefault(jObject, Parameters.AmountNqt, obj => Amount.CreateAmountFromNqt(Convert.ToInt64(obj))); transaction.Attachment = attachmentConverter.GetAttachment(subType); transaction.BlockId = GetValueOrNull(jObject, Parameters.Block, Convert.ToUInt64); transaction.BlockTimestamp = GetDateTimeOrNull(jObject, Parameters.BlockTimestamp); transaction.Confirmations = GetValueOrNull(jObject, Parameters.Confirmations, Convert.ToInt32); transaction.Deadline = GetValueOrDefault(jObject, Parameters.Deadline, Convert.ToInt16); transaction.EcBlockId = GetValueOrDefault(jObject, Parameters.EcBlockId, Convert.ToUInt64); transaction.EcBlockHeight = GetValueOrDefault(jObject, Parameters.EcBlockHeight, Convert.ToInt32); transaction.EncryptedMessage = EncryptedMessage.ParseJson(attachmentJobject); transaction.EncryptToSelfMessage = EncryptToSelfMessage.ParseJson(attachmentJobject); transaction.Fee = GetValueOrDefault(jObject, Parameters.FeeNqt, obj => Amount.CreateAmountFromNqt(Convert.ToInt64(obj))); transaction.FullHash = GetValueOrDefault(jObject, Parameters.FullHash, obj => obj.ToString()); transaction.Height = GetValueOrDefault(jObject, Parameters.Height, Convert.ToInt32); transaction.Message = Message.ParseJson(attachmentJobject); transaction.Recipient = GetValueOrNull(jObject, Parameters.Recipient, Convert.ToUInt64); transaction.RecipientRs = GetValueOrDefault(jObject, Parameters.RecipientRs, obj => obj.ToString()); transaction.ReferencedTransactionFullHash = GetValueOrDefault(jObject, Parameters.ReferencedTransactionFullHash, obj => new BinaryHexString(obj.ToString())); transaction.Phased = GetValueOrDefault(jObject, Parameters.Phased, Convert.ToBoolean); transaction.Phasing = TransactionPhasing.ParseJson(attachmentJobject); transaction.PublicKeyAnnouncement = PublicKeyAnnouncement.ParseJson(attachmentJobject); transaction.Sender = GetValueOrDefault(jObject, Parameters.Sender, Convert.ToUInt64); transaction.SenderRs = GetValueOrDefault(jObject, Parameters.SenderRs, obj => obj.ToString()); transaction.SenderPublicKey = GetValueOrDefault(jObject, Parameters.SenderPublicKey, obj => new BinaryHexString(obj.ToString())); transaction.Signature = GetValueOrDefault(jObject, Parameters.Signature, obj => new BinaryHexString(obj.ToString())); transaction.SignatureHash = GetValueOrDefault(jObject, Parameters.SignatureHash, obj => obj.ToString()); transaction.SubType = subType; transaction.Timestamp = GetDateTimeOrDefault(jObject, Parameters.Timestamp); transaction.TransactionId = GetValueOrNull(jObject, Parameters.Transaction, Convert.ToUInt64); transaction.TransactionIndex = GetValueOrDefault(jObject, Parameters.TransactionIndex, Convert.ToInt32); transaction.Type = type; transaction.Version = GetValueOrDefault(jObject, Parameters.Version, Convert.ToInt32); return(transaction); }