Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
5e11704
Version bump
meywood Feb 20, 2025
cb3d1d9
issues/394 - Wip fixing failed chainPutContractCep18 test
meywood Mar 26, 2025
67a12d9
issues/394 - Added new fields current_price and refund to ExecutionRe…
meywood May 7, 2025
593b76e
issues/394 - Added cep18-rc3.wasm from go SDK repo
meywood Jun 26, 2025
394cf6d
issues/394 - Added cep18-rc3.wasm from go SDK repo
meywood Jun 26, 2025
c52c0ed
issues/394 - Changed TransactionRuntime to match node changes
meywood Jul 13, 2025
90be9c6
issues/394 - Corrected test data to mach node changes
meywood Jul 13, 2025
93da19b
issues/394 - Corrected test data to mach node changes
meywood Jul 13, 2025
03c7213
issues/394 - Corrected test data to mach node changes
meywood Jul 13, 2025
b2951d9
Working CSPR transfer in HowTo against Testnet
cnorburn Jul 14, 2025
0eedec1
Cep18 contract deployment to Testnet
cnorburn Jul 17, 2025
9850b87
issues/394 - Corrected test data to mach node changes
meywood Jul 30, 2025
1933d35
Testing state_get_entity with contract hash
cnorburn Aug 1, 2025
ef8b69b
issues/394 - Fixes for Contract entity changes.
meywood Aug 4, 2025
dcdbcba
issues/394 - Fixes for ContractHash conversion from keys and digests
meywood Aug 4, 2025
cad3881
issues/394 - Fixes for ContractHash conversion from keys and digests
meywood Aug 4, 2025
a732313
issues/394 - Fixes for ContractHash conversion from keys and digests
meywood Aug 5, 2025
030130c
issues/394 - Fixes for GlobalStateData changes
meywood Sep 22, 2025
eb4aed5
issues/394 - Fixes for GlobalStateData changes
meywood Sep 22, 2025
e81a944
Individual HowTo classes
cnorburn Oct 14, 2025
851db75
issues/394 - Fixes for CustomEntryPoint
meywood Nov 13, 2025
2578f96
issues/394 - Fixes for HowToInstallASmartContract
meywood Nov 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ apply plugin: 'java'

group = 'network.casper'
// Version number update for release
version='2.7.0-BETA.3'
version='2.7.0-BETA.4'
sourceCompatibility = 1.8
targetCompatibility = 1.8

Expand Down
2 changes: 1 addition & 1 deletion script/docker-run
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
CONTAINER_NAME="cspr-cctl"
#CONTAINER_NAME="cspr-nctl-condor"
IMAGE_VERSION="condor"
IMAGE_VERSION="release-2.0.1"
# run the cspr-nctl container in docker
docker run --rm -it --name ${CONTAINER_NAME} -d -p 25101:25101 -p 11101:11101 -p 14101:14101 -p 18101:18101 -p 21101:21101 stormeye2000/${CONTAINER_NAME}:${IMAGE_VERSION}
60 changes: 60 additions & 0 deletions src/main/java/com/casper/sdk/identifier/entity/ContractHash.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.casper.sdk.identifier.entity;

import com.casper.sdk.model.common.Digest;
import com.casper.sdk.model.key.Key;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSetter;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;

/**
* The hash of an on-chain contract .
*
* @author carl@stormeye.co.uk
*/

@Builder
@EqualsAndHashCode
@Getter
@NoArgsConstructor
public class ContractHash implements EntityIdentifier {

private static final String PREFIX = "contract-";

/** Contract key hash */
@JsonProperty("ContractHash")
private String hash;


public ContractHash(final String hash) {
this.setHash(hash);
}

public ContractHash(final Digest hash) {
this(hash.toString());
}

public ContractHash(final Key contractKey) {
this(contractKey.toString());
}

@JsonSetter("ContractHash")
public void setHash(final String hash) {
String[] split = hash.split("-");
this.hash = split[split.length - 1];
}

@Override
@JsonGetter("ContractHash")
public String toString() {
return PREFIX + hash;
}

public Digest asDigest() {
return hash != null ? new Digest(hash) : null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.casper.sdk.identifier.global;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Builder
@AllArgsConstructor
public class BlockHeightIdentifier implements GlobalStateIdentifier{

@JsonProperty("BlockHeight")
private long height;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.casper.sdk.jackson.deserializer;

import com.casper.sdk.model.block.BlockHeader;
import com.casper.sdk.model.block.BlockHeaderV2;
import com.casper.sdk.model.block.JsonBlockHeader;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.io.IOException;

/**
* @author ian@meywood.com
*/
public class BlockHeaderDeserializer extends JsonDeserializer<BlockHeader> {
@Override
public BlockHeader deserialize(final JsonParser p, final DeserializationContext ctx) throws IOException {

final ObjectNode treeNode = p.readValueAsTree();
final String fieldName = treeNode.fieldNames().next();
try (JsonParser parser = treeNode.get(fieldName).traverse()) {
parser.setCodec(ctx.getParser().getCodec());
if ("Version1".equals(fieldName)) {
return parser.readValueAs(JsonBlockHeader.class);
} else if ("Version2".equals(fieldName)) {
return parser.readValueAs(BlockHeaderV2.class);
} else {
throw new IllegalArgumentException("Unknown BlockHeader type: " + fieldName);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,12 @@ public class EntryPointV1Deserializer extends JsonDeserializer<EntryPointV1> {
@Override
public EntryPointV1 deserialize(final JsonParser p, final DeserializationContext ctxt) throws IOException {

final JsonNode mapNode = p.getCodec().readTree(p);
final JsonNode entryPointNode = mapNode.get("entry_point");
JsonNode mapNode = p.getCodec().readTree(p);
JsonNode entryPointNode = mapNode.get("entry_point");

if (entryPointNode == null) {
entryPointNode = mapNode;
}

return EntryPointV1.builder()
.name(mapNode.get("name").asText())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.casper.sdk.exception.DeserializationException;
import com.casper.sdk.exception.NoSuchTypeException;
import com.casper.sdk.model.common.Digest;
import com.casper.sdk.model.transaction.target.*;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
Expand Down Expand Up @@ -48,8 +47,7 @@ private Stored createStored(final JsonNode node, final DeserializationContext ct
try {
return new Stored(
createInvocationTarget(node, ctx),
TransactionRuntime.fromJson(node.get(RUNTIME).asText()),
node.has(TRANSFERRED_VALUE) ? node.get(TRANSFERRED_VALUE).asLong() : 0
TransactionRuntime.fromJson(node.get(RUNTIME))
);
} catch (NoSuchTypeException e) {
throw new DeserializationException("Unable to find 'runtime'", e);
Expand All @@ -67,10 +65,8 @@ private Session createSession(final JsonNode node) throws DeserializationExcepti
try {
return new Session(
node.has(IS_INSTALL_UPGRADE) && node.get(IS_INSTALL_UPGRADE).asBoolean(),
TransactionRuntime.fromJson(node.get(RUNTIME).asText()),
Hex.decode(node.get(MODULE_BYTES).asText()),
node.has(TRANSFERRED_VALUE) ? node.get(TRANSFERRED_VALUE).asLong() : 0,
node.has(SEED) && !node.get(SEED).isNull() && !"null".equals(node.get(SEED).asText()) ? new Digest(node.get(SEED).asText()) : null
TransactionRuntime.fromJson(node.get(RUNTIME)),
Hex.decode(node.get(MODULE_BYTES).asText())
);
} catch (NoSuchTypeException e) {
throw new DeserializationException("Unable to find required fields", e);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.casper.sdk.jackson.serializer;

import com.casper.sdk.model.block.BlockHeader;
import com.casper.sdk.model.block.BlockHeaderV2;
import com.casper.sdk.model.block.JsonBlockHeader;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

/**
* @author ian@meywood.com
*/
public class BlockHeaderSerializer extends JsonSerializer<BlockHeader> {

@Override
public void serialize(final BlockHeader blockHeader,
final JsonGenerator jsonGenerator,
final SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeStartObject();

if (blockHeader instanceof JsonBlockHeader) {
jsonGenerator.writeFieldName("Version1");
} else if (blockHeader instanceof BlockHeaderV2) {
jsonGenerator.writeFieldName("Version2");

} else {
throw new IllegalArgumentException("Unsupported block header: " + blockHeader);
}
jsonGenerator.writeObject(blockHeader);
jsonGenerator.writeEndObject();
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.casper.sdk.jackson.serializer;

import com.casper.sdk.model.transaction.target.*;
import com.casper.sdk.model.transaction.target.Native;
import com.casper.sdk.model.transaction.target.Session;
import com.casper.sdk.model.transaction.target.Stored;
import com.casper.sdk.model.transaction.target.TransactionTarget;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
Expand All @@ -17,8 +20,6 @@
*/
public class TransactionTargetSerializer extends JsonSerializer<TransactionTarget> {



@Override
public void serialize(final TransactionTarget value, final JsonGenerator gen, final SerializerProvider serializers) throws IOException {

Expand All @@ -41,9 +42,8 @@ private static void serializeStored(final Stored value, final JsonGenerator gen)
gen.writeObject(value.getId());
if (value.getRuntime() != null) {
gen.writeFieldName(RUNTIME);
gen.writeString(value.getRuntime().getJsonName());
value.getRuntime().toJson(gen);
}
gen.writeNumberField(TRANSFERRED_VALUE, value.getTransferredValue());
gen.writeEndObject();
gen.writeEndObject();
}
Expand All @@ -53,12 +53,13 @@ private static void serializeSession(final Session value, final JsonGenerator ge
gen.writeFieldName(SESSION);
gen.writeStartObject();
gen.writeBooleanField(IS_INSTALL_UPGRADE, value.isInstallUpgrade());
gen.writeStringField(RUNTIME, TransactionRuntime.toJson(value.getRuntime()));
if (value.getRuntime() != null) {
gen.writeFieldName(RUNTIME);
value.getRuntime().toJson(gen);
}
gen.writeStringField(MODULE_BYTES, Hex.encode(value.getModuleBytes()));
gen.writeNumberField(TRANSFERRED_VALUE, value.getTransferredValue());
gen.writeObjectField(SEED, value.getSeed());
gen.writeEndObject();

gen.writeEndObject();
gen.writeEndObject();
}
}
3 changes: 2 additions & 1 deletion src/main/java/com/casper/sdk/model/account/Account.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.casper.sdk.model.contract.NamedKey;
import com.casper.sdk.model.key.AccountHashKey;
import com.casper.sdk.model.uref.URef;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand Down Expand Up @@ -48,7 +49,7 @@ public class Account {
* main_purse(String) Hex-encoded, formatted URef.
*/
@JsonProperty("main_purse")
private String mainPurse;
private URef mainPurse;

/**
* named_keys (@link NamedKey)
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/com/casper/sdk/model/block/BlockHeaderV2.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.casper.sdk.model.common.Digest;
import com.casper.sdk.model.era.EraEndV2;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;

Expand All @@ -15,6 +16,7 @@
@Builder
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class BlockHeaderV2 extends BlockHeader {

@JsonProperty("era_end")
Expand Down
7 changes: 4 additions & 3 deletions src/main/java/com/casper/sdk/model/contract/Contract.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import lombok.*;

import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
Expand All @@ -31,7 +32,7 @@ public class Contract {

/** entry_points(Array) - A list of entry points. */
@JsonProperty("entry_points")
private List<EntryPointV1> entryPoints;
private Map<String, EntryPointV1> entryPoints;

/** named_keys(Array) - A list of named keys. */
@JsonProperty("named_keys")
Expand All @@ -41,7 +42,7 @@ public class Contract {
@JsonProperty("protocol_version")
private String protocolVersion;

public Optional<EntryPointV1> getEntryPoint(String name) {
return entryPoints.stream().filter(entryPoint -> entryPoint.getName().equals(name)).findFirst();
public Optional<EntryPointV1> getEntryPoint(final String name) {
return Optional.ofNullable(entryPoints.get(name));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public class ContractPackage {

/** disabled_versions(Array/DisabledVersion) */
@JsonProperty("disabled_versions")
private List<DisabledVersion> disabledVersions;
private List<List<Long>> disabledVersions;

/** The lock status of the contract package */
@JsonProperty("lock_status")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,5 @@ public class ContractWasm {
* ContractWasm(object/string) A contract's Wasm.
*/
@JsonProperty("bytes")
private String wasm;
private String bytes;
}
3 changes: 2 additions & 1 deletion src/main/java/com/casper/sdk/model/entity/AccountEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.casper.sdk.model.account.AssociatedKey;
import com.casper.sdk.model.contract.NamedKey;
import com.casper.sdk.model.key.AccountHashKey;
import com.casper.sdk.model.uref.URef;
import com.fasterxml.jackson.annotation.JsonTypeName;
import lombok.NoArgsConstructor;

Expand All @@ -22,7 +23,7 @@ public class AccountEntity extends Account implements StateEntity {
public AccountEntity(final AccountHashKey hash,
final ActionThresholds deployment,
final List<AssociatedKey> associatedKeys,
final String mainPurse,
final URef mainPurse,
final List<NamedKey> namedKeys) {
super(hash, deployment, associatedKeys, mainPurse, namedKeys);
}
Expand Down
20 changes: 8 additions & 12 deletions src/main/java/com/casper/sdk/model/entity/ContractEntity.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package com.casper.sdk.model.entity;

import com.casper.sdk.model.contract.Contract;
import com.casper.sdk.model.contract.NamedKey;
import com.casper.sdk.model.contract.entrypoint.EntryPointV1;
import com.casper.sdk.model.entity.contract.Wasm;
import com.fasterxml.jackson.annotation.JsonTypeName;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;
import lombok.Setter;

/**
* Contract entity
Expand All @@ -15,13 +14,10 @@
*/
@NoArgsConstructor
@JsonTypeName("Contract")
public class ContractEntity extends Contract implements StateEntity {
@Getter
@Setter
public class ContractEntity implements StateEntity {

public ContractEntity(final String packageHash,
final String wasmHash,
final List<EntryPointV1> entryPoints,
final List<NamedKey> namedKeys,
final String protocolVersion) {
super(packageHash, wasmHash, entryPoints, namedKeys, protocolVersion);
}
private Contract contract;
private Wasm wasm;
}
Loading