diff --git a/graphenej/src/main/java/cy/agorise/graphenej/operations/RedeemHtlcOperation.java b/graphenej/src/main/java/cy/agorise/graphenej/operations/RedeemHtlcOperation.java new file mode 100644 index 0000000..5a693ff --- /dev/null +++ b/graphenej/src/main/java/cy/agorise/graphenej/operations/RedeemHtlcOperation.java @@ -0,0 +1,110 @@ +package cy.agorise.graphenej.operations; + +import com.google.common.primitives.Bytes; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutput; +import java.io.DataOutputStream; +import java.io.IOException; + +import cy.agorise.graphenej.AssetAmount; +import cy.agorise.graphenej.BaseOperation; +import cy.agorise.graphenej.Htlc; +import cy.agorise.graphenej.OperationType; +import cy.agorise.graphenej.UserAccount; +import cy.agorise.graphenej.Util; +import cy.agorise.graphenej.Varint; + +/** + * Class used to encapsulate the redeem_htlc operation. + */ +public class RedeemHtlcOperation extends BaseOperation { + static final String KEY_REDEEMER = "redeemer"; + static final String KEY_PREIMAGE = "preimage"; + static final String KEY_HTLC_ID = "htlc_id"; + + private AssetAmount fee; + private UserAccount redeemer; + private Htlc htlc; + private byte[] preimage; + + /** + * Public constructor + * + * @param fee The fee associated with this operation. + * @param redeemer The user account that will redeem the HTLC. + * @param htlc The existing HTLC operation. + */ + public RedeemHtlcOperation(AssetAmount fee, UserAccount redeemer, Htlc htlc, byte[] preimage) { + super(OperationType.HTLC_REDEEM_OPERATION); + this.fee = fee; + this.redeemer = redeemer; + this.htlc = htlc; + this.preimage = preimage; + } + + @Override + public void setFee(AssetAmount fee) { + this.fee = fee; + } + + public AssetAmount getFee(){ + return this.fee; + } + + public UserAccount getRedeemer() { + return redeemer; + } + + public void setRedeemer(UserAccount redeemer) { + this.redeemer = redeemer; + } + + public Htlc getHtlc() { + return htlc; + } + + public void setHtlc(Htlc htlc) { + this.htlc = htlc; + } + + @Override + public byte[] toBytes() { + byte[] feeBytes = this.fee.toBytes(); + byte[] htlcBytes = this.htlc.toBytes(); + byte[] redeemerBytes = this.redeemer.toBytes(); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + DataOutput out = new DataOutputStream(byteArrayOutputStream); + try{ + Varint.writeUnsignedVarLong(this.preimage.length, out); + } catch (IOException e) { + e.printStackTrace(); + } + byte[] preimageLength = byteArrayOutputStream.toByteArray(); + return Bytes.concat(feeBytes, htlcBytes, redeemerBytes, preimageLength, this.preimage); + } + + @Override + public JsonElement toJsonObject() { + JsonArray array = new JsonArray(); + array.add(this.getId()); + JsonObject jsonObject = new JsonObject(); + jsonObject.add(KEY_FEE, fee.toJsonObject()); + jsonObject.add(KEY_REDEEMER, this.redeemer.toJsonObject()); + jsonObject.addProperty(KEY_PREIMAGE, Util.bytesToHex(this.preimage)); + jsonObject.addProperty(KEY_HTLC_ID, this.htlc.getObjectId()); + jsonObject.add(KEY_EXTENSIONS, new JsonArray()); + array.add(jsonObject); + return array; + } + + @Override + public String toJsonString() { + GsonBuilder gsonBuilder = new GsonBuilder(); + return gsonBuilder.create().toJson(this); + } +}