Skip to content

Commit

Permalink
Merge pull request #54 from bloxbean/fix_49
Browse files Browse the repository at this point in the history
feat: #49 Add new redeemer purpose, gov action changes
  • Loading branch information
satran004 authored Feb 26, 2024
2 parents 8d858f7 + f2bfcfd commit d9b0094
Show file tree
Hide file tree
Showing 17 changed files with 202 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,5 @@ public class AuxData {
private List<NativeScript> nativeScripts;
private List<PlutusScript> plutusV1Scripts;
private List<PlutusScript> plutusV2Scripts;
private List<PlutusScript> plutusV3Scripts;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.bloxbean.cardano.yaci.core.model;

import co.nstant.in.cbor.model.Array;
import co.nstant.in.cbor.model.DataItem;
import co.nstant.in.cbor.model.UnsignedInteger;
import com.bloxbean.cardano.yaci.core.exception.CborRuntimeException;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigInteger;
import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ExUnits {
private BigInteger mem;
private BigInteger steps;

public Array serialize() {
Array array = new Array();
array.add(new UnsignedInteger(mem));
array.add(new UnsignedInteger(steps));

return array;
}

public static ExUnits deserialize(Array exUnitDI) {
List<DataItem> dataItemList = exUnitDI.getDataItems();
if (dataItemList == null || dataItemList.size() != 2)
throw new CborRuntimeException("ExUnits deserialization error. Invalid no of DataItem");

DataItem memDI = dataItemList.get(0);
DataItem stepsDI = dataItemList.get(1);

ExUnits exUnits = new ExUnits();
exUnits.setMem(((UnsignedInteger) memDI).getValue());
exUnits.setSteps(((UnsignedInteger) stepsDI).getValue());

return exUnits;
}

}

Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@
@ToString
@Builder
public class PlutusScript {
private String type;
private PlutusScriptType type;
private String content;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.bloxbean.cardano.yaci.core.model;

public enum PlutusScriptType {
PlutusScriptV1,
PlutusScriptV2,
PlutusScriptV3
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@ public class PoolVotingThresholds {
private BigDecimal pvtCommitteeNormal;
private BigDecimal pvtCommitteeNoConfidence;
private BigDecimal pvtHardForkInitiation;
private BigDecimal pvtPPSecurityGroup;
}
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,5 @@ public class ProtocolParamUpdate {
private BigInteger govActionDeposit; //30
private BigInteger drepDeposit; //31
private Integer drepActivity; //32
private Integer minFeeRefScriptCostPerByte; //33
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
package com.bloxbean.cardano.yaci.core.model;

import co.nstant.in.cbor.CborException;
import co.nstant.in.cbor.model.Array;
import co.nstant.in.cbor.model.DataItem;
import co.nstant.in.cbor.model.UnsignedInteger;
import com.bloxbean.cardano.client.exception.CborDeserializationException;
import com.bloxbean.cardano.client.plutus.spec.ExUnits;
import com.bloxbean.cardano.client.plutus.spec.RedeemerTag;
import com.bloxbean.cardano.yaci.core.exception.CborRuntimeException;
import com.bloxbean.cardano.yaci.core.util.CborSerializationUtil;
import com.bloxbean.cardano.yaci.core.util.HexUtil;
Expand All @@ -26,11 +22,10 @@ public class Redeemer {
private ExUnits exUnits;
private String cbor;

public static Redeemer deserializePreConway(Array redeemerDI)
throws CborDeserializationException, CborException {
public static Redeemer deserializePreConway(Array redeemerDI) {
List<DataItem> redeemerDIList = redeemerDI.getDataItems();
if (redeemerDIList == null || redeemerDIList.size() != 4) {
throw new CborDeserializationException(
throw new CborRuntimeException(
"Redeemer deserialization error. Invalid no of DataItems");
}

Expand Down Expand Up @@ -74,8 +69,9 @@ public static Redeemer deserialize(Array keyDI, Array valueDI) { //Conway era

}

@SneakyThrows
private static Redeemer getRedeemer(Array redeemerDI, UnsignedInteger tagDI, UnsignedInteger indexDI,
DataItem dataDI, Array exUnitDI) throws CborDeserializationException, CborException {
DataItem dataDI, Array exUnitDI) {
Redeemer redeemer = new Redeemer();

// Tag
Expand All @@ -88,6 +84,10 @@ private static Redeemer getRedeemer(Array redeemerDI, UnsignedInteger tagDI, Uns
redeemer.setTag(RedeemerTag.Cert);
} else if (tagValue == 3) {
redeemer.setTag(RedeemerTag.Reward);
} else if (tagValue == 4) {
redeemer.setTag(RedeemerTag.Voting);
} else if (tagValue == 5) {
redeemer.setTag(RedeemerTag.Proposing);
}

// Index
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.bloxbean.cardano.yaci.core.model;

import com.fasterxml.jackson.annotation.JsonProperty;

public enum RedeemerTag {
@JsonProperty("spend")
Spend(0),
@JsonProperty("mint")
Mint(1),
@JsonProperty("cert")
Cert(2),
@JsonProperty("reward")
Reward(3),
@JsonProperty("voting")
Voting(4),
@JsonProperty("proposing")
Proposing(5);

public final int value;

RedeemerTag(int value) {
this.value = value;
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
import lombok.*;

/**
* parameter_change_action = (0, gov_action_id / null, protocol_param_update)
* {@literal
* parameter_change_action = (0, gov_action_id / null, protocol_param_update, policy_hash / null)
* }
*/
@Getter
@AllArgsConstructor
Expand All @@ -19,4 +21,5 @@ public class ParameterChangeAction implements GovAction {

private GovActionId govActionId;
private ProtocolParamUpdate protocolParamUpdate;
private String policyHash; //script hash
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

/**
* {@literal
* treasury_withdrawals_action = (2, { reward_account => coin })
* treasury_withdrawals_action = (2, { reward_account => coin }, policy_hash / null)
* }
*/
@Getter
Expand All @@ -23,4 +23,5 @@ public class TreasuryWithdrawalsAction implements GovAction {

@Builder.Default
private Map<String, BigInteger> withdrawals = new LinkedHashMap<>();
private String policyHash;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@
import com.bloxbean.cardano.client.exception.CborDeserializationException;
import com.bloxbean.cardano.client.exception.CborRuntimeException;
import com.bloxbean.cardano.client.metadata.Metadata;
import com.bloxbean.cardano.client.metadata.cbor.CBORMetadata;
import com.bloxbean.cardano.client.metadata.helper.MetadataToJsonNoSchemaConverter;
import com.bloxbean.cardano.client.transaction.spec.AuxiliaryData;
import com.bloxbean.cardano.yaci.core.model.AuxData;
import com.bloxbean.cardano.yaci.core.model.NativeScript;
import com.bloxbean.cardano.yaci.core.model.PlutusScript;
import com.bloxbean.cardano.yaci.core.model.PlutusScriptType;
import com.bloxbean.cardano.yaci.core.protocol.Serializer;
import com.bloxbean.cardano.yaci.core.util.HexUtil;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -17,6 +19,8 @@
import java.util.List;
import java.util.stream.Collectors;

import static com.bloxbean.cardano.yaci.core.util.CborSerializationUtil.toHex;

@Slf4j
public enum AuxDataSerializer implements Serializer<AuxData> {
INSTANCE;
Expand All @@ -28,21 +32,61 @@ public AuxData deserializeDI(DataItem di) {
List<NativeScript> nativeScripts = null;
List<PlutusScript> plutusV1scripts = null;
List<PlutusScript> plutusV2scripts = null;
List<PlutusScript> plutusV3scripts = null;

if (di.getMajorType() == MajorType.MAP) { //Shelley + Alonzo
AuxiliaryData auxiliaryData = AuxiliaryData.deserialize((Map) di);
metadata = auxiliaryData.getMetadata();
if (di.getMajorType() == MajorType.MAP) {
Tag mapTag = di.getTag();
Map map = (Map) di;

if (auxiliaryData.getPlutusV1Scripts() != null) {
plutusV1scripts = auxiliaryData.getPlutusV1Scripts().stream()
.map(plutusV1Script -> new PlutusScript(String.valueOf(plutusV1Script.getScriptType()), plutusV1Script.getCborHex()))
.collect(Collectors.toList());
}
if (mapTag != null && mapTag.getValue() == 259) { //Alonzo and beyond
DataItem metadataValueDI = map.get(new UnsignedInteger(0));
DataItem nativeScriptsValueDI = map.get(new UnsignedInteger(1));
DataItem plutusV1ScriptsValueDI = map.get(new UnsignedInteger(2));
DataItem plutusV2ScriptsValueDI = map.get(new UnsignedInteger(3));
DataItem plutusV3ScriptsValueDI = map.get(new UnsignedInteger(4));

if (metadataValueDI != null) {
metadata = CBORMetadata.deserialize((Map) metadataValueDI);
}

//Native scripts
if (nativeScriptsValueDI != null) {
Array nativeScriptsArray = (Array) nativeScriptsValueDI;
nativeScripts = nativeScriptsArray.getDataItems()
.stream()
.map(nativeScriptDI -> WitnessesSerializer.INSTANCE.deserializeNativeScript((Array) nativeScriptDI))
.collect(Collectors.toList());
}

//plutus_v1_script
if (plutusV1ScriptsValueDI != null) {
Array plutusV1ScriptsArray = (Array) plutusV1ScriptsValueDI;
plutusV1scripts = plutusV1ScriptsArray.getDataItems()
.stream()
.map(plutusV1ScriptDI -> new PlutusScript(PlutusScriptType.PlutusScriptV1, toHex(plutusV1ScriptDI)))
.collect(Collectors.toList());
}

//plutus_v2_script
if (plutusV2ScriptsValueDI != null) {
Array plutusV2ScriptsArray = (Array) plutusV2ScriptsValueDI;
plutusV2scripts = plutusV2ScriptsArray.getDataItems()
.stream()
.map(plutusV2ScriptDI -> new PlutusScript(PlutusScriptType.PlutusScriptV2, toHex(plutusV2ScriptDI)))
.collect(Collectors.toList());
}

//plutus_v3_script
if (plutusV3ScriptsValueDI != null) {
Array plutusV3ScriptsArray = (Array) plutusV3ScriptsValueDI;
plutusV3scripts = plutusV3ScriptsArray.getDataItems()
.stream()
.map(plutusV3ScriptDI -> new PlutusScript(PlutusScriptType.PlutusScriptV3, toHex(plutusV3ScriptDI)))
.collect(Collectors.toList());
}

if (auxiliaryData.getPlutusV2Scripts() != null) {
plutusV2scripts = auxiliaryData.getPlutusV2Scripts().stream()
.map(plutusV2Script -> new PlutusScript(String.valueOf(plutusV2Script.getScriptType()), plutusV2Script.getCborHex()))
.collect(Collectors.toList());
} else { //shelley
metadata = CBORMetadata.deserialize(map);
}

} else if (di.getMajorType() == MajorType.ARRAY) { //Shelley ma era. Handle it here as it's not handled in cardano-client-lib
Expand Down Expand Up @@ -74,7 +118,7 @@ public AuxData deserializeDI(DataItem di) {
metadataCbor = HexUtil.encodeHexString(metadata.serialize());
}

return new AuxData(metadataCbor, metadataJson, nativeScripts, plutusV1scripts, plutusV2scripts);
return new AuxData(metadataCbor, metadataJson, nativeScripts, plutusV1scripts, plutusV2scripts, plutusV3scripts);

} catch (CborDeserializationException e) {
throw new CborRuntimeException("AuxiliaryData deserialization failed", e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,9 @@ public ProtocolParamUpdate getProtocolParams(Map genesisProtocolParamsMap) {
itemDI = genesisProtocolParamsMap.get(new UnsignedInteger(32));
Integer drepInactivityPeriod = itemDI != null ? toInt(itemDI) : null;

itemDI = genesisProtocolParamsMap.get(new UnsignedInteger(33));
Integer minFeeRefScriptCostPerByte = itemDI != null ? toInt(itemDI) : null;

ProtocolParamUpdate protocolParamUpdate = ProtocolParamUpdate.builder()
.minFeeA(minFeeA)
.minFeeB(minFeeB)
Expand Down Expand Up @@ -246,6 +249,7 @@ public ProtocolParamUpdate getProtocolParams(Map genesisProtocolParamsMap) {
.govActionDeposit(governanceActionDeposit)
.drepDeposit(drepDeposit)
.drepActivity(drepInactivityPeriod)
.minFeeRefScriptCostPerByte(minFeeRefScriptCostPerByte)
.build();
return protocolParamUpdate;
}
Expand Down Expand Up @@ -289,12 +293,14 @@ private PoolVotingThresholds deserializePoolVotingThresholds(DataItem itemDI) {
BigDecimal committeeNormal = toRationalNumber((RationalNumber) poolVotingThresholds.get(1));
BigDecimal committeeNoConfidence = toRationalNumber((RationalNumber) poolVotingThresholds.get(2));
BigDecimal hardForkInitiation = toRationalNumber((RationalNumber) poolVotingThresholds.get(3));
BigDecimal ppSecurityGroup = toRationalNumber((RationalNumber) poolVotingThresholds.get(4));

return PoolVotingThresholds.builder()
.pvtMotionNoConfidence(motionNoConfidence)
.pvtCommitteeNormal(committeeNormal)
.pvtCommitteeNoConfidence(committeeNoConfidence)
.pvtHardForkInitiation(hardForkInitiation)
.pvtPPSecurityGroup(ppSecurityGroup)
.build();

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

import co.nstant.in.cbor.model.*;
import com.bloxbean.cardano.client.exception.CborRuntimeException;
import com.bloxbean.cardano.client.plutus.spec.PlutusV1Script;
import com.bloxbean.cardano.client.plutus.spec.PlutusV2Script;
import com.bloxbean.cardano.client.spec.Script;
import com.bloxbean.cardano.client.transaction.spec.script.*;
import com.bloxbean.cardano.client.util.JsonUtil;
Expand Down Expand Up @@ -82,12 +80,11 @@ public Witnesses deserializeDI(DataItem di) {
for (DataItem plutusV1ScriptDI : plutusV1ScriptDIList) {
if (plutusV1ScriptDI == Special.BREAK)
continue;
PlutusV1Script plutusV1Script = PlutusV1Script.deserialize((ByteString) plutusV1ScriptDI);

if (plutusV1Script != null) {
PlutusScript plutusScript = new PlutusScript(String.valueOf(plutusV1Script.getScriptType()), plutusV1Script.getCborHex());
plutusV1Scripts.add(plutusScript);
}
String scriptCborHex = toHex(plutusV1ScriptDI);

PlutusScript plutusScript = new PlutusScript(PlutusScriptType.PlutusScriptV1, scriptCborHex);
plutusV1Scripts.add(plutusScript);
}
} catch (Exception e) {
throw new CborRuntimeException("PlutusV1 script deserialization failed", e);
Expand Down Expand Up @@ -136,12 +133,12 @@ public Witnesses deserializeDI(DataItem di) {
try {
for (DataItem plutusV2ScriptDI : plutusV2ScriptDIList) {
if (plutusV2ScriptDI == Special.BREAK) continue;
PlutusV2Script plutusV2Script = PlutusV2Script.deserialize((ByteString) plutusV2ScriptDI);

if (plutusV2Script != null) {
PlutusScript plutusScript = new PlutusScript(String.valueOf(plutusV2Script.getScriptType()), plutusV2Script.getCborHex());
plutusV2Scripts.add(plutusScript);
}
String scriptCborHex = toHex(plutusV2ScriptDI);

PlutusScript plutusScript = new PlutusScript(PlutusScriptType.PlutusScriptV2, scriptCborHex);
plutusV2Scripts.add(plutusScript);

}
} catch (Exception e) {
throw new CborRuntimeException("Plutus V2 script deserialization failed", e);
Expand All @@ -157,7 +154,7 @@ public Witnesses deserializeDI(DataItem di) {
if (plutusV3ScriptDI == Special.BREAK) continue;
String scriptCborHex = toHex(plutusV3ScriptDI);

PlutusScript plutusScript = new PlutusScript(String.valueOf(3), scriptCborHex);
PlutusScript plutusScript = new PlutusScript(PlutusScriptType.PlutusScriptV3, scriptCborHex);
plutusV3Scripts.add(plutusScript);
}
} catch (Exception e) {
Expand Down
Loading

0 comments on commit d9b0094

Please sign in to comment.