package jstellarapi.core; import java.math.BigInteger; import jstellarapi.connection.JSONSerializable; import jstellarapi.serialization.StellarBinaryObject; import jstellarapi.serialization.StellarBinarySchema.BinaryFormatField; import jstellarapi.serialization.StellarBinarySchema.TransactionTypes; import org.apache.commons.lang3.builder.ToStringBuilder; import org.json.simple.JSONObject; public class StellarPaymentTransaction extends StellarTransaction implements JSONSerializable { public StellarAddress payer; public StellarAddress payee; public DenominatedIssuedCurrency amount; public String signedTransactionBlob; public long sequenceNumber; public long destinationTag = -1; public String txHash; public String signature; public String publicKeyUsedToSign; public DenominatedIssuedCurrency fee; public long flags; public StellarPaymentTransaction(StellarAddress payer, StellarAddress payee, DenominatedIssuedCurrency amount, int sequenceNumber) { this.payer = payer; this.payee = payee; this.amount = amount; this.sequenceNumber = sequenceNumber; this.fee = DenominatedIssuedCurrency.FEE; } public StellarPaymentTransaction(StellarBinaryObject serObj) { super(serObj); if (serObj.getTransactionType() != TransactionTypes.PAYMENT) { throw new RuntimeException("The StellarBinaryObject is not a payment transaction, but a " + serObj.getTransactionType()); } payer = (StellarAddress) serObj.getField(BinaryFormatField.Account); payee = (StellarAddress) serObj.getField(BinaryFormatField.Destination); amount = (DenominatedIssuedCurrency) serObj.getField(BinaryFormatField.Amount); sequenceNumber = (long) serObj.getField(BinaryFormatField.Sequence); fee = (DenominatedIssuedCurrency) serObj.getField(BinaryFormatField.Fee); flags = (long) serObj.getField(BinaryFormatField.Flags); } public StellarPaymentTransaction(JSONObject jsonTx) { fromTxJSON(jsonTx); } public StellarBinaryObject getBinaryObject() { StellarBinaryObject rbo = new StellarBinaryObject(); rbo.putField(BinaryFormatField.TransactionType, (int) TransactionTypes.PAYMENT.byteValue); rbo.putField(BinaryFormatField.Account, this.payer); rbo.putField(BinaryFormatField.Destination, this.payee); rbo.putField(BinaryFormatField.Amount, this.amount); rbo.putField(BinaryFormatField.Sequence, this.sequenceNumber); rbo.putField(BinaryFormatField.Fee, this.fee); rbo.putField(BinaryFormatField.Flags, this.flags); return rbo; } @SuppressWarnings("unchecked") public JSONObject toTxJSON() { JSONObject jsonTx = new JSONObject(); jsonTx.put("Account", payer.toString()); jsonTx.put("Destination", payee.toString()); jsonTx.put("Amount", amount.toJSON()); jsonTx.put("TransactionType", "Payment"); if(destinationTag>=0&&destinationTag<=4294967295l){ jsonTx.put("DestinationTag", String.valueOf(destinationTag)); } return jsonTx; } @Override public void copyFrom(JSONObject jsonCommandResult) { signedTransactionBlob = (String) jsonCommandResult.get("tx_blob"); JSONObject tx_json = (JSONObject) jsonCommandResult.get("tx_json"); if (tx_json != null) { fromTxJSON(tx_json); } } protected void fromTxJSON(JSONObject tx_json) { payer = new StellarAddress((String) tx_json.get("Account")); payee = new StellarAddress((String) tx_json.get("Destination")); sequenceNumber = (Long) tx_json.get("Sequence"); txHash = (String) tx_json.get("hash"); signature = (String) tx_json.get("TxnSignature"); publicKeyUsedToSign = (String) tx_json.get("SigningPubKey"); flags = (Long) tx_json.get("Flags"); Object amount = tx_json.get("Amount"); if (amount instanceof String) { String amountInMicroSTR = (String) amount; this.amount = new DenominatedIssuedCurrency(amountInMicroSTR); } else if (amount instanceof JSONObject) { JSONObject jamt = (JSONObject) amount; this.amount = new DenominatedIssuedCurrency(jamt.get("value").toString(), new StellarAddress(jamt.get("issuer").toString()), jamt.get("currency").toString()); } else { this.amount = new DenominatedIssuedCurrency(); } Object fee = tx_json.get("Fee"); if (fee != null) { this.fee = new DenominatedIssuedCurrency(new BigInteger(fee.toString())); } } public String getSignedTxBlob() { return signedTransactionBlob; } @Override public String toString() { return ToStringBuilder.reflectionToString(this); } }