class PassportTransactionFormatter {

    public byte[][] buildRawTransaction() {

        // Version
        byte[] step1 = new BigInteger("01000000", 16).toByteArray();

        // Number of outputs
        byte[] step2 = new byte[]{0x01};

        if (utxo.getParentTransactionHash() == null)
            return null;

        // Transaction hash
        byte[] step3 = utxo.getParentTransactionHash().getReversedBytes();

        // Output index
        byte[] step4 = ByteBuffer.allocate(4).putInt(Integer.reverseBytes(utxo.getIndex())).array();

        // Length of scriptsig (scriptpubkey)
        byte[] step5 = new byte[] {(byte) (utxo.getScriptBytes().length & 0xFF)};

        // Scriptpubkey of output we want to redeem
        byte[] step6 = utxo.getScriptBytes();

        // Unused sequence
        byte[] step7 = Util.hexStringToByteArray("FFFFFFFF");

        // Number of outputs in transaction
        byte[] step8 = Util.hexStringToByteArray("01");

        // Spend amount
        byte[] step9 = Util.hexStringToByteArray("0000000000000000");

        // Size of redeem script
        byte[] step10 = new byte[]{(byte) (step6.length & 0xFF)};

        // Redeem script (copies output and replaces address)
        byte[] step11 = step6.clone();
        System.arraycopy(this.destination.getHash160(), 0, step11, 3, 20);

        // Lock time
        byte[] step12 = Util.hexStringToByteArray("00000000");

        // Hash code type
        byte[] step13 = Util.hexStringToByteArray("01000000");

        return new byte[][]{step1, step2, step3, step4, step5, step6, step7, step8, step9,
                step10, step11, step12, step13};
    }

    public  PassportTransactionFormatter(TransactionOutput utxo, Address destination);

}