package com.msgilligan.bitcoinj.json.pojo;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.msgilligan.bitcoinj.json.conversion.TransactionHexSerializer;
import org.bitcoinj.core.Coin;
import org.bitcoinj.core.Sha256Hash;
import org.bitcoinj.core.Transaction;
import org.bitcoinj.core.TransactionInput;
import org.bitcoinj.core.TransactionOutput;
import java.util.ArrayList;
import java.util.List;
/**
* RawTransaction POJO
*/
@JsonIgnoreProperties(ignoreUnknown=true)
// "hash" property added (present in Bitcoin 0.13)
public class RawTransactionInfo {
public final String hex;
public final Sha256Hash txid;
public final long version;
public final long locktime;
public final VinList vin;
public final VoutList vout;
public final Sha256Hash blockhash;
public final int confirmations;
public final long time;
public final long blocktime;
@JsonCreator
public RawTransactionInfo(@JsonProperty("hex") String hex,
@JsonProperty("txid") Sha256Hash txid,
@JsonProperty("version") long version,
@JsonProperty("locktime") long locktime,
@JsonProperty("vin") VinList vin,
@JsonProperty("vout") VoutList vout,
@JsonProperty("blockhash") Sha256Hash blockhash,
@JsonProperty("confirmations") int confirmations,
@JsonProperty("time") long time,
@JsonProperty("blocktime") long blocktime) {
this.hex = hex;
this.txid = txid;
this.version = version;
this.locktime = locktime;
this.vin = vin;
this.vout = vout;
this.blockhash = blockhash;
this.confirmations = confirmations;
this.time = time;
this.blocktime = blocktime;
}
/**
* Construct from a bitcoinj transaction
* @param transaction A bitcoinj confirmed or unconfirmed transaction
*/
public RawTransactionInfo(Transaction transaction) {
this.hex = TransactionHexSerializer.bytesToHexString(transaction.bitcoinSerialize());
this.txid = transaction.getHash();
this.version = transaction.getVersion();
this.locktime = transaction.getLockTime();
this.blockhash = null; // For now
this.confirmations = transaction.getConfidence().getDepthInBlocks();
this.time = 0; // TODO: block header time of block including transaction
this.blocktime = this.time; // same as time (see API doc)
vin = new VinList();
for (TransactionInput input : transaction.getInputs()) {
vin.add(new Vin(input.getHash(),
input.getOutpoint().getIndex(),
input.getScriptSig().toString(),
input.getSequenceNumber()));
}
vout = new VoutList();
for (TransactionOutput output : transaction.getOutputs()) {
vout.add(new Vout(output.getValue(),
output.getIndex(),
output.getScriptPubKey().toString()));
}
}
public String getHex() {
return hex;
}
public Sha256Hash getTxid() {
return txid;
}
public long getVersion() {
return version;
}
public long getLocktime() {
return locktime;
}
public List<Vin> getVin() {
return vin;
}
public List<Vout> getVout() {
return vout;
}
public Sha256Hash getBlockhash() {
return blockhash;
}
public int getConfirmations() {
return confirmations;
}
public long getTime() {
return time;
}
public long getBlocktime() {
return blocktime;
}
public static class VinList extends ArrayList<Vin> {
}
public static class VoutList extends ArrayList<Vout> {
}
public static class Vin {
public final Sha256Hash txid;
public final long vout;
public final Object scriptSig;
public final long sequence;
public Vin(@JsonProperty("txid") Sha256Hash txid,
@JsonProperty("vout") long vout,
@JsonProperty("scriptSig") Object scriptSig,
@JsonProperty("sequence") long sequence) {
this.txid = txid;
this.vout = vout;
this.scriptSig = scriptSig;
this.sequence = sequence;
}
public Sha256Hash getTxid() {
return txid;
}
public long getVout() {
return vout;
}
public Object getScriptSig() {
return scriptSig;
}
public long getSequence() {
return sequence;
}
}
public static class Vout {
public final Coin value;
public final int n;
public final Object scriptPubKey;
public Vout(@JsonProperty("value") Coin value,
@JsonProperty("n") int n,
@JsonProperty("scriptPubKey") Object scriptPubKey) {
this.value = value;
this.n = n;
this.scriptPubKey = scriptPubKey;
}
public Coin getValue() {
return value;
}
public int getN() {
return n;
}
public Object getScriptPubKey() {
return scriptPubKey;
}
}
}