diff --git a/src/main/java/org/qortal/crosschain/Bitcoiny.java b/src/main/java/org/qortal/crosschain/Bitcoiny.java index d4693818..3665f4ba 100644 --- a/src/main/java/org/qortal/crosschain/Bitcoiny.java +++ b/src/main/java/org/qortal/crosschain/Bitcoiny.java @@ -406,14 +406,24 @@ public abstract class Bitcoiny implements ForeignBlockchain { protected SimpleTransaction convertToSimpleTransaction(BitcoinyTransaction t, Set keySet) { long amount = 0; long total = 0L; + long totalInputAmount = 0L; + long totalOutputAmount = 0L; + List inputs = new ArrayList<>(); + List outputs = new ArrayList<>(); + for (BitcoinyTransaction.Input input : t.inputs) { try { BitcoinyTransaction t2 = getTransaction(input.outputTxHash); List senders = t2.outputs.get(input.outputVout).addresses; + long inputAmount = t2.outputs.get(input.outputVout).value; + totalInputAmount += inputAmount; for (String sender : senders) { + boolean addressInWallet = false; if (keySet.contains(sender)) { - total += t2.outputs.get(input.outputVout).value; + total += inputAmount; + addressInWallet = true; } + inputs.add(new SimpleTransaction.Input(sender, inputAmount, addressInWallet)); } } catch (ForeignBlockchainException e) { LOGGER.trace("Failed to retrieve transaction information {}", input.outputTxHash); @@ -422,17 +432,22 @@ public abstract class Bitcoiny implements ForeignBlockchain { if (t.outputs != null && !t.outputs.isEmpty()) { for (BitcoinyTransaction.Output output : t.outputs) { for (String address : output.addresses) { + boolean addressInWallet = false; if (keySet.contains(address)) { if (total > 0L) { amount -= (total - output.value); } else { amount += output.value; } + addressInWallet = true; } + outputs.add(new SimpleTransaction.Output(address, output.value, addressInWallet)); } + totalOutputAmount += output.value; } } - return new SimpleTransaction(t.txHash, t.timestamp, amount); + long fee = totalInputAmount - totalOutputAmount; + return new SimpleTransaction(t.txHash, t.timestamp, amount, fee, inputs, outputs); } /** diff --git a/src/main/java/org/qortal/crosschain/SimpleTransaction.java b/src/main/java/org/qortal/crosschain/SimpleTransaction.java index 0fae20a5..27c9f9e3 100644 --- a/src/main/java/org/qortal/crosschain/SimpleTransaction.java +++ b/src/main/java/org/qortal/crosschain/SimpleTransaction.java @@ -2,20 +2,85 @@ package org.qortal.crosschain; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; +import java.util.List; @XmlAccessorType(XmlAccessType.FIELD) public class SimpleTransaction { private String txHash; private Integer timestamp; private long totalAmount; + private long feeAmount; + private List inputs; + private List outputs; + + + @XmlAccessorType(XmlAccessType.FIELD) + public static class Input { + private String address; + private long amount; + private boolean addressInWallet; + + public Input() { + } + + public Input(String address, long amount, boolean addressInWallet) { + this.address = address; + this.amount = amount; + this.addressInWallet = addressInWallet; + } + + public String getAddress() { + return address; + } + + public long getAmount() { + return amount; + } + + public boolean getAddressInWallet() { + return addressInWallet; + } + } + + @XmlAccessorType(XmlAccessType.FIELD) + public static class Output { + private String address; + private long amount; + private boolean addressInWallet; + + public Output() { + } + + public Output(String address, long amount, boolean addressInWallet) { + this.address = address; + this.amount = amount; + this.addressInWallet = addressInWallet; + } + + public String getAddress() { + return address; + } + + public long getAmount() { + return amount; + } + + public boolean getAddressInWallet() { + return addressInWallet; + } + } + public SimpleTransaction() { } - public SimpleTransaction(String txHash, Integer timestamp, long totalAmount) { + public SimpleTransaction(String txHash, Integer timestamp, long totalAmount, long feeAmount, List inputs, List outputs) { this.txHash = txHash; this.timestamp = timestamp; this.totalAmount = totalAmount; + this.feeAmount = feeAmount; + this.inputs = inputs; + this.outputs = outputs; } public String getTxHash() { @@ -29,4 +94,16 @@ public class SimpleTransaction { public long getTotalAmount() { return totalAmount; } -} \ No newline at end of file + + public long getFeeAmount() { + return feeAmount; + } + + public List getInputs() { + return this.inputs; + } + + public List getOutputs() { + return this.outputs; + } +}