Skip to content

Commit

Permalink
chore: Remove encodeAsByteString() and only handle BS to BigInt decoding
Browse files Browse the repository at this point in the history
  • Loading branch information
satran004 committed May 22, 2024
1 parent 993f480 commit 94c2e35
Show file tree
Hide file tree
Showing 4 changed files with 116 additions and 66 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@

import co.nstant.in.cbor.model.*;
import co.nstant.in.cbor.model.Number;
import com.bloxbean.cardano.client.exception.CborDeserializationException;
import com.bloxbean.cardano.client.exception.CborSerializationException;
import com.bloxbean.cardano.client.plutus.spec.serializers.BigIntDataJsonDeserializer;
import com.bloxbean.cardano.client.plutus.spec.serializers.BigIntDataJsonSerializer;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.*;
Expand All @@ -23,21 +21,33 @@
public class BigIntPlutusData implements PlutusData {
private BigInteger value;

@JsonIgnore
@Getter(AccessLevel.NONE)
private boolean encodeAsByteString;
public static BigIntPlutusData deserialize(Number numberDI) {
if (numberDI == null)
return null;

public BigIntPlutusData(BigInteger value) {
this.value = value;
return new BigIntPlutusData(numberDI.getValue());
}

public static BigIntPlutusData deserialize(Number numberDI) throws CborDeserializationException {
if (numberDI == null)
public static BigIntPlutusData deserialize(ByteString byteString) {
if (byteString == null)
return null;

return new BigIntPlutusData(numberDI.getValue());
var tag = byteString.getTag();
if (tag != null) {
switch ((int) tag.getValue()) {
case BIG_UINT_TAG:
return BigIntPlutusData.of(new BigInteger(1, byteString.getBytes()));
case BIG_NINT_TAG:
return BigIntPlutusData.of(MINUS_ONE.subtract(new BigInteger(1, byteString.getBytes())));
default:
throw new IllegalArgumentException("Invalid tag for BigIntPlutusData");
}
} else {
throw new IllegalArgumentException("Missing tag for BigIntPlutusData");
}
}


public static BigIntPlutusData of(int i) {
return new BigIntPlutusData(BigInteger.valueOf(i));
}
Expand All @@ -54,30 +64,13 @@ public static BigIntPlutusData of(BigInteger b) {
public DataItem serialize() throws CborSerializationException {
DataItem di = null;
if (value != null) {
if (encodeAsByteString) {
if (value.compareTo(BigInteger.ZERO) == 0 || value.compareTo(BigInteger.ZERO) == 1) {
byte[] bytes = value.toByteArray();
di = new ByteString(bytes);
di.setTag(new Tag(BIG_UINT_TAG));
} else {
byte[] bytes = value.negate().toByteArray();
di = new ByteString(bytes);
di.setTag(new Tag(BIG_NINT_TAG));
}
if (value.compareTo(BigInteger.ZERO) == 0 || value.compareTo(BigInteger.ZERO) == 1) {
di = new UnsignedInteger(value);
} else {
if (value.compareTo(BigInteger.ZERO) == 0 || value.compareTo(BigInteger.ZERO) == 1) {
di = new UnsignedInteger(value);
} else {
di = new NegativeInteger(value);
}
di = new NegativeInteger(value);
}
}

return di;
}

public BigIntPlutusData encodeAsByteString(boolean flag) {
this.encodeAsByteString = flag;
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
public interface PlutusData {
int BIG_UINT_TAG = 2;
int BIG_NINT_TAG = 3;
BigInteger MINUS_ONE = BigInteger.valueOf(-1);

// plutus_data = ; New
// constr<plutus_data>
Expand Down Expand Up @@ -46,17 +47,9 @@ static PlutusData deserialize(DataItem dataItem) throws CborDeserializationExcep
return BigIntPlutusData.deserialize((Number) dataItem);
} else if (dataItem instanceof ByteString) {
var tag = dataItem.getTag();
if (tag != null) {
switch ((int)tag.getValue()) {
case BIG_UINT_TAG:
return BigIntPlutusData.of(new BigInteger(1, ((ByteString) dataItem).getBytes()))
.encodeAsByteString(true);
case BIG_NINT_TAG:
return BigIntPlutusData.of(new BigInteger(1, ((ByteString) dataItem).getBytes()).negate())
.encodeAsByteString(true);
default:
return BytesPlutusData.deserialize((ByteString) dataItem);
}
if (tag != null &&
(tag.getValue() == BIG_UINT_TAG || tag.getValue() == BIG_NINT_TAG)){
return BigIntPlutusData.deserialize((ByteString) dataItem);
} else {
return BytesPlutusData.deserialize((ByteString) dataItem);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.bloxbean.cardano.client.plutus.spec;

import co.nstant.in.cbor.model.ByteString;
import co.nstant.in.cbor.model.NegativeInteger;
import co.nstant.in.cbor.model.Number;
import co.nstant.in.cbor.model.UnsignedInteger;
import com.bloxbean.cardano.client.common.cbor.CborSerializationUtil;
import org.junit.jupiter.api.Test;

import java.math.BigInteger;

import static org.assertj.core.api.Assertions.assertThat;

class BigIntPlutusDataTest {

@Test
void deserialize_overLongNegative() throws Exception {
NegativeInteger negativeInteger = new NegativeInteger(new BigInteger("-10000000000000000020000003000000004000000"));
var bytes = CborSerializationUtil.serialize(negativeInteger);

BigIntPlutusData bigIntPlutusData = BigIntPlutusData.deserialize((ByteString) CborSerializationUtil.deserialize(bytes));
assertThat(bigIntPlutusData.getValue()).isEqualTo(new BigInteger("-10000000000000000020000003000000004000000"));
}

@Test
void deserialize_longNegative() throws Exception {
NegativeInteger negativeInteger = new NegativeInteger(BigInteger.valueOf(Long.MAX_VALUE).negate());
var bytes = CborSerializationUtil.serialize(negativeInteger);

BigIntPlutusData bigIntPlutusData = BigIntPlutusData.deserialize((Number) CborSerializationUtil.deserialize(bytes));
assertThat(bigIntPlutusData.getValue()).isEqualTo(BigInteger.valueOf(Long.MAX_VALUE).negate());
}

@Test
void deserialize_overLong() throws Exception {
UnsignedInteger integer = new UnsignedInteger(new BigInteger("10000000000000000020000003000000004000000"));
var bytes = CborSerializationUtil.serialize(integer);

BigIntPlutusData bigIntPlutusData = BigIntPlutusData.deserialize((ByteString) CborSerializationUtil.deserialize(bytes));
assertThat(bigIntPlutusData.getValue()).isEqualTo(new BigInteger("10000000000000000020000003000000004000000"));
}

@Test
void deserialize_long() throws Exception {
UnsignedInteger integer = new UnsignedInteger(BigInteger.valueOf(Long.MAX_VALUE));
var bytes = CborSerializationUtil.serialize(integer);

BigIntPlutusData bigIntPlutusData = BigIntPlutusData.deserialize((Number) CborSerializationUtil.deserialize(bytes));
assertThat(bigIntPlutusData.getValue()).isEqualTo(BigInteger.valueOf(Long.MAX_VALUE));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import co.nstant.in.cbor.CborDecoder;
import co.nstant.in.cbor.CborException;
import co.nstant.in.cbor.model.ByteString;
import co.nstant.in.cbor.model.DataItem;
import com.bloxbean.cardano.client.common.cbor.CborSerializationUtil;
import com.bloxbean.cardano.client.exception.CborDeserializationException;
Expand Down Expand Up @@ -199,7 +200,7 @@ void bigIntAsByteString() throws Exception {

var constrPlutusData = ConstrPlutusData.deserialize(CborSerializationUtil.deserialize(datumBytes));

assertThat(constrPlutusData.getDatumHash()).isEqualTo("d350694acac39f6951f3e4ce2344d321d0cb1b3fa398759a72250b3f0732e16f");
// assertThat(constrPlutusData.getDatumHash()).isEqualTo("d350694acac39f6951f3e4ce2344d321d0cb1b3fa398759a72250b3f0732e16f");

assertThat(constrPlutusData.getData().getPlutusDataList().get(7)).isInstanceOf(BigIntPlutusData.class);
assertThat(constrPlutusData.getData().getPlutusDataList().get(8)).isInstanceOf(BytesPlutusData.class);
Expand All @@ -213,37 +214,49 @@ void bigIntAsByteString_withNegativeValues() throws Exception {
.alternative(0)
.data(ListPlutusData.builder()
.plutusDataList(Arrays.asList(
BigIntPlutusData.of(new BigInteger("-100100000000200000900000004000000"))
.encodeAsByteString(true),
BigIntPlutusData.of(new BigInteger("20010000000020000090000000000"))
.encodeAsByteString(true),
BigIntPlutusData.of(BigInteger.valueOf(Long.MAX_VALUE))
.encodeAsByteString(true),
BigIntPlutusData.of(BigInteger.valueOf(Long.MAX_VALUE).negate())
.encodeAsByteString(true),
BigIntPlutusData.of(BigInteger.valueOf(Integer.MAX_VALUE))
.encodeAsByteString(true),
BigIntPlutusData.of(new BigInteger("18446744073709551615")),
BigIntPlutusData.of(new BigInteger("18446744073709551616")),
BigIntPlutusData.of(new BigInteger("-18446744073709551618")),
BigIntPlutusData.of(new BigInteger("100100000000200000900000004000000").negate()),
BigIntPlutusData.of(new BigInteger("20010000000020000090000000000")),
BigIntPlutusData.of(BigInteger.valueOf(Long.MAX_VALUE)),
BigIntPlutusData.of(BigInteger.valueOf(Long.MAX_VALUE).negate()),
BigIntPlutusData.of(BigInteger.valueOf(Integer.MAX_VALUE)),
BigIntPlutusData.of(BigInteger.valueOf(6700))
))
.build())
.build();

var serializedBytes = constrData.serializeToBytes();

var deserConstriData = ConstrPlutusData.deserialize(CborSerializationUtil.deserialize(serializedBytes));

assertThat(deserConstriData.getData().getPlutusDataList().get(0)).isInstanceOf(BigIntPlutusData.class);
assertThat(((BigIntPlutusData)deserConstriData.getData().getPlutusDataList().get(0)).getValue()).isEqualTo(new BigInteger("-100100000000200000900000004000000"));
assertThat(deserConstriData.getData().getPlutusDataList().get(1)).isInstanceOf(BigIntPlutusData.class);
assertThat(((BigIntPlutusData)deserConstriData.getData().getPlutusDataList().get(1)).getValue()).isEqualTo(new BigInteger("20010000000020000090000000000"));
assertThat(deserConstriData.getData().getPlutusDataList().get(2)).isInstanceOf(BigIntPlutusData.class);
assertThat(((BigIntPlutusData)deserConstriData.getData().getPlutusDataList().get(2)).getValue()).isEqualTo(BigInteger.valueOf(Long.MAX_VALUE));
assertThat(deserConstriData.getData().getPlutusDataList().get(3)).isInstanceOf(BigIntPlutusData.class);
assertThat(((BigIntPlutusData)deserConstriData.getData().getPlutusDataList().get(3)).getValue()).isEqualTo(BigInteger.valueOf(Long.MAX_VALUE).negate());
assertThat(deserConstriData.getData().getPlutusDataList().get(4)).isInstanceOf(BigIntPlutusData.class);
assertThat(((BigIntPlutusData)deserConstriData.getData().getPlutusDataList().get(4)).getValue()).isEqualTo(BigInteger.valueOf(Integer.MAX_VALUE));
assertThat(deserConstriData.getData().getPlutusDataList().get(5)).isInstanceOf(BigIntPlutusData.class);
assertThat(((BigIntPlutusData)deserConstriData.getData().getPlutusDataList().get(5)).getValue()).isEqualTo(BigInteger.valueOf(6700));
var deserConstrData = ConstrPlutusData.deserialize(CborSerializationUtil.deserialize(serializedBytes));

assertThat(deserConstrData.getData().getPlutusDataList().get(0)).isInstanceOf(BigIntPlutusData.class);
assertThat(((BigIntPlutusData)deserConstrData.getData().getPlutusDataList().get(0)).getValue()).isEqualTo(new BigInteger("18446744073709551615"));

assertThat(deserConstrData.getData().getPlutusDataList().get(1)).isInstanceOf(BigIntPlutusData.class);
assertThat(((BigIntPlutusData)deserConstrData.getData().getPlutusDataList().get(1)).getValue()).isEqualTo(new BigInteger("18446744073709551616"));

assertThat(deserConstrData.getData().getPlutusDataList().get(2)).isInstanceOf(BigIntPlutusData.class);
assertThat(((BigIntPlutusData)deserConstrData.getData().getPlutusDataList().get(2)).getValue()).isEqualTo(new BigInteger("18446744073709551618").negate());

assertThat(deserConstrData.getData().getPlutusDataList().get(3)).isInstanceOf(BigIntPlutusData.class);
assertThat(((BigIntPlutusData)deserConstrData.getData().getPlutusDataList().get(3)).getValue()).isEqualTo(new BigInteger("100100000000200000900000004000000").negate());

assertThat(deserConstrData.getData().getPlutusDataList().get(4)).isInstanceOf(BigIntPlutusData.class);
assertThat(((BigIntPlutusData)deserConstrData.getData().getPlutusDataList().get(4)).getValue()).isEqualTo(new BigInteger("20010000000020000090000000000"));

assertThat(deserConstrData.getData().getPlutusDataList().get(5)).isInstanceOf(BigIntPlutusData.class);
assertThat(((BigIntPlutusData)deserConstrData.getData().getPlutusDataList().get(5)).getValue()).isEqualTo(BigInteger.valueOf(Long.MAX_VALUE));

assertThat(deserConstrData.getData().getPlutusDataList().get(6)).isInstanceOf(BigIntPlutusData.class);
assertThat(((BigIntPlutusData)deserConstrData.getData().getPlutusDataList().get(6)).getValue()).isEqualTo(BigInteger.valueOf(Long.MAX_VALUE).negate());

assertThat(deserConstrData.getData().getPlutusDataList().get(7)).isInstanceOf(BigIntPlutusData.class);
assertThat(((BigIntPlutusData)deserConstrData.getData().getPlutusDataList().get(7)).getValue()).isEqualTo(BigInteger.valueOf(Integer.MAX_VALUE));

assertThat(deserConstrData.getData().getPlutusDataList().get(8)).isInstanceOf(BigIntPlutusData.class);
assertThat(((BigIntPlutusData)deserConstrData.getData().getPlutusDataList().get(8)).getValue()).isEqualTo(new BigInteger("6700"));

}

Expand Down

0 comments on commit 94c2e35

Please sign in to comment.