package com.ripple.core.types.ledger;

import com.ripple.core.binary.STReader;
import com.ripple.core.coretypes.RippleDate;
import com.ripple.core.coretypes.hash.HalfSha512;
import com.ripple.core.coretypes.hash.Hash256;
import com.ripple.core.coretypes.hash.prefixes.HashPrefix;
import com.ripple.core.coretypes.uint.UInt32;
import com.ripple.core.coretypes.uint.UInt64;
import com.ripple.core.coretypes.uint.UInt8;
import com.ripple.core.serialized.BinaryParser;
import com.ripple.core.serialized.BytesSink;
import org.json.JSONWriter;

import java.util.Date;

public class LedgerHeader {
    // Always 0x4C475200 (LWR) (Secures signed objects)
    public UInt32  version = HashPrefix.ledgerMaster.uInt32;

    public UInt32  sequence;        // Ledger Sequence (0 for genesis ledger)
    public UInt64  totalXRP;        //
    public Hash256 previousLedger;  // The hash of the previous ledger (0 for genesis ledger)
    public Hash256 transactionHash; // The hash of the transaction tree's root node.
    public Hash256 stateHash;       // The hash of the state tree's root node.
    public UInt32  parentCloseTime; // The time the previous ledger closed
    public UInt32  closeTime;       // UTC minute ledger closed encoded as seconds since 1/1/2000 (or 0 for genesis ledger)
    public UInt8   closeResolution; // The resolution (in seconds) of the close time
    public UInt8   closeFlags;      // Flags

    public Date closeDate;

    public static LedgerHeader fromParser(BinaryParser parser) {
        return fromReader(new STReader(parser));
    }
    public static LedgerHeader fromReader(STReader reader) {
        LedgerHeader ledger = new LedgerHeader();

        ledger.sequence = reader.uInt32();
        ledger.totalXRP = reader.uInt64();
        ledger.previousLedger = reader.hash256();
        ledger.transactionHash= reader.hash256();
        ledger.stateHash = reader.hash256();
        ledger.parentCloseTime = reader.uInt32();
        ledger.closeTime = reader.uInt32();
        ledger.closeResolution = reader.uInt8();
        ledger.closeFlags = reader.uInt8();

        ledger.closeDate = RippleDate.fromSecondsSinceRippleEpoch(ledger.closeTime);

        return ledger;
    }

    public void toBytesSink(BytesSink sink) {
        sequence.toBytesSink(sink);
        totalXRP.toBytesSink(sink);
        previousLedger.toBytesSink(sink);
        transactionHash.toBytesSink(sink);
        stateHash.toBytesSink(sink);
        parentCloseTime.toBytesSink(sink);
        closeTime.toBytesSink(sink);
        closeResolution.toBytesSink(sink);
        closeFlags.toBytesSink(sink);
    }

    public Hash256 hash() {
        HalfSha512 half = HalfSha512.prefixed256(HashPrefix.ledgerMaster);
        toBytesSink(half);
        return half.finish();
    }

    public void writeObjectFields(JSONWriter writer) {
        writer.key("ledger_index");
        writer.value(sequence.toJSON());
        writer.key("total_coins");
        writer.value(totalXRP.toString(10));
        writer.key("parent_hash");
        writer.value(previousLedger.toJSON());
        writer.key("transaction_hash");
        writer.value(transactionHash.toJSON());
        writer.key("account_hash");
        writer.value(stateHash.toJSON());
        writer.key("close_time");
        writer.value(closeTime.toJSON());
        writer.key("close_time_resolution");
        writer.value(closeResolution.toJSON());
        writer.key("close_flags");
        writer.value(closeFlags.toJSON());
    }
}

@@ -2797,25 +2797,20 @@
 oid 
-writeObjectFields
+toJSONWriter
 (JSO
@@ -3300,32 +3300,121 @@
 Time.toJSON());%0A
+        writer.key(%22parent_close_time%22);%0A        writer.value(parentCloseTime.toJSON());%0A
         writer.k

Add `parent_close_time` to LedgerHeader#toJSONWriter