Skip to content

Commit 86209dc

Browse files
authored
Merge pull request #266 from /issues/262
issues/262 - Version should byte serialize as Option type.
2 parents 011239c + cce6c10 commit 86209dc

6 files changed

Lines changed: 224 additions & 77 deletions

File tree

build.gradle

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ apply plugin: 'java'
1414

1515
group = 'network.casper'
1616
// Version number update for release
17-
version='2.5.4'
17+
version='2.5.5'
1818
sourceCompatibility = 1.8
1919
targetCompatibility = 1.8
2020

@@ -26,9 +26,6 @@ repositories {
2626
dependencies {
2727
implementation "dev.oak3:sbs4j:${sbs4jVersion}"
2828
implementation "io.github.oak:jsonrpc4j:${jsonrpc4jVersion}"
29-
// implementation "com.syntifi.crypto:crypto-key-common:${cryptokeyVersion}"
30-
// implementation "com.syntifi.crypto:crypto-key-ed25519:${cryptokeyVersion}"
31-
// implementation "com.syntifi.crypto:crypto-key-secp256k1:${cryptokeyVersion}"
3229
implementation "org.bouncycastle:bcpkix-jdk15on:${bouncyCastleVersion}"
3330
implementation "org.web3j:core:${web3jVersion}"
3431
implementation "com.fasterxml.jackson.core:jackson-core:${jacksonVersion}"
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.casper.sdk.model.deploy.executabledeploy;
2+
3+
import com.casper.sdk.exception.NoSuchTypeException;
4+
import com.casper.sdk.model.clvalue.AbstractCLValue;
5+
import com.casper.sdk.model.clvalue.CLValueOption;
6+
import com.casper.sdk.model.clvalue.CLValueU32;
7+
import com.casper.sdk.model.clvalue.serde.Target;
8+
import com.casper.sdk.model.deploy.NamedArg;
9+
import com.fasterxml.jackson.annotation.JsonIgnore;
10+
import com.fasterxml.jackson.annotation.JsonProperty;
11+
import dev.oak3.sbs4j.SerializerBuffer;
12+
import dev.oak3.sbs4j.exception.ValueSerializationException;
13+
import lombok.*;
14+
15+
import java.util.List;
16+
import java.util.Optional;
17+
18+
/**
19+
* Base class for versioned contracts.
20+
*
21+
* @author ian@meywood.com
22+
*/
23+
@Getter
24+
@Setter
25+
@AllArgsConstructor
26+
@NoArgsConstructor
27+
abstract class AbstractStoredVersionedContract extends ExecutableDeployItemWithEntryPoint {
28+
29+
/** contract version */
30+
@JsonProperty("version")
31+
private Long version;
32+
33+
/** Entry Point */
34+
@JsonProperty("entry_point")
35+
private String entryPoint;
36+
37+
/** @see NamedArg */
38+
private List<NamedArg<?>> args;
39+
40+
@JsonIgnore
41+
public Optional<Long> getVersion() {
42+
return Optional.ofNullable(version);
43+
}
44+
45+
@Override
46+
public void serialize(final SerializerBuffer ser, final Target target) throws NoSuchTypeException, ValueSerializationException {
47+
ser.writeU8(getOrder());
48+
serializeCustom(ser);
49+
50+
final Optional<AbstractCLValue<?, ?>> innerValue;
51+
if (version == null) {
52+
innerValue = Optional.empty();
53+
} else {
54+
innerValue = Optional.of(new CLValueU32(version));
55+
}
56+
new CLValueOption(innerValue).serialize(ser, Target.JSON);
57+
58+
ser.writeString(getEntryPoint());
59+
serializeNamedArgs(ser, target);
60+
}
61+
62+
protected abstract void serializeCustom(final SerializerBuffer ser);
63+
}
Lines changed: 12 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
11
package com.casper.sdk.model.deploy.executabledeploy;
22

3-
import com.casper.sdk.exception.NoSuchTypeException;
4-
import com.casper.sdk.model.clvalue.serde.Target;
53
import com.casper.sdk.model.deploy.NamedArg;
64
import com.fasterxml.jackson.annotation.JsonProperty;
75
import com.fasterxml.jackson.annotation.JsonTypeName;
86
import dev.oak3.sbs4j.SerializerBuffer;
9-
import dev.oak3.sbs4j.exception.ValueSerializationException;
107
import lombok.*;
118

129
import java.util.List;
1310

1411
/**
15-
* Abstract Executable Deploy Item containing the StoredVersionedContractByHash.
12+
* Executable Deploy Item containing the StoredVersionedContractByHash.
1613
*
1714
* @author Alexandre Carvalho
1815
* @author Andre Bertolace
@@ -21,50 +18,29 @@
2118
*/
2219
@Getter
2320
@Setter
24-
@Builder
25-
@AllArgsConstructor
2621
@NoArgsConstructor
2722
@JsonTypeName("StoredVersionedContractByHash")
28-
public class StoredVersionedContractByHash extends ExecutableDeployItemWithEntryPoint {
23+
public class StoredVersionedContractByHash extends AbstractStoredVersionedContract {
2924

30-
/**
31-
* Hex-encoded Hash
32-
*/
33-
private String hash;
34-
35-
/**
36-
* contract version
37-
*/
38-
private long version;
25+
@Builder
26+
public StoredVersionedContractByHash(final String hash, final Long version, final String entryPoint, final List<NamedArg<?>> args) {
27+
super(version, entryPoint, args);
28+
this.hash = hash;
29+
}
3930

40-
/**
41-
* Entry Point
42-
*/
43-
@JsonProperty("entry_point")
44-
private String entryPoint;
31+
/** Hex-encoded Hash */
32+
@JsonProperty("hash")
33+
private String hash;
4534

46-
/**
47-
* @see NamedArg
48-
*/
49-
private List<NamedArg<?>> args;
5035

51-
/**
52-
* {@link ExecutableDeployItem} order 3
53-
*/
36+
/** {@link ExecutableDeployItem} order 3 */
5437
@Override
5538
public byte getOrder() {
5639
return 0x3;
5740
}
5841

59-
/**
60-
* Implements the StoredVersionedContractByHash encoder
61-
*/
6242
@Override
63-
public void serialize(final SerializerBuffer ser, final Target target) throws NoSuchTypeException, ValueSerializationException {
64-
ser.writeU8(getOrder());
43+
protected void serializeCustom(final SerializerBuffer ser) {
6544
ser.writeString(getHash());
66-
ser.writeI64(getVersion());
67-
ser.writeString(getEntryPoint());
68-
serializeNamedArgs(ser, target);
6945
}
7046
}
Lines changed: 11 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
package com.casper.sdk.model.deploy.executabledeploy;
22

3-
import com.casper.sdk.exception.NoSuchTypeException;
4-
import com.casper.sdk.model.clvalue.serde.Target;
53
import com.casper.sdk.model.deploy.NamedArg;
6-
import com.fasterxml.jackson.annotation.JsonProperty;
74
import com.fasterxml.jackson.annotation.JsonTypeName;
85
import dev.oak3.sbs4j.SerializerBuffer;
9-
import dev.oak3.sbs4j.exception.ValueSerializationException;
106
import lombok.*;
117

128
import java.util.List;
139

1410
/**
15-
* Abstract Executable Deploy Item containing the StoredVersionedContractByName.
11+
* Executable Deploy Item containing the StoredVersionedContractByName.
1612
*
1713
* @author Alexandre Carvalho
1814
* @author Andre Bertolace
@@ -21,51 +17,29 @@
2117
*/
2218
@Getter
2319
@Setter
24-
@Builder
20+
@Builder(access = AccessLevel.PROTECTED)
2521
@AllArgsConstructor
2622
@NoArgsConstructor
2723
@JsonTypeName("StoredVersionedContractByName")
28-
public class StoredVersionedContractByName extends ExecutableDeployItemWithEntryPoint {
24+
public class StoredVersionedContractByName extends AbstractStoredVersionedContract {
2925

30-
/**
31-
* Contract Name
32-
*/
26+
/** Contract Name */
3327
private String name;
3428

35-
/**
36-
* contract version
37-
*/
38-
private long version;
39-
40-
/**
41-
* Entry Point
42-
*/
43-
@JsonProperty("entry_point")
44-
private String entryPoint;
45-
46-
/**
47-
* List of @see NamedArg
48-
*/
49-
private List<NamedArg<?>> args;
29+
@Builder
30+
public StoredVersionedContractByName(final String name, final Long version, final String entryPoint, final List<NamedArg<?>> args) {
31+
super(version, entryPoint, args);
32+
this.name = name;
33+
}
5034

51-
/**
52-
* {@link ExecutableDeployItem} order 4
53-
*/
35+
/** {@link ExecutableDeployItem} order 4 */
5436
@Override
5537
public byte getOrder() {
5638
return 0x4;
5739
}
5840

59-
/**
60-
* Implements the StoredVersionedContractName encoder
61-
*/
6241
@Override
63-
public void serialize(final SerializerBuffer ser, final Target target) throws ValueSerializationException, NoSuchTypeException {
64-
ser.writeU8(getOrder());
42+
protected void serializeCustom(final SerializerBuffer ser) {
6543
ser.writeString(getName());
66-
ser.writeI64(getVersion());
67-
ser.writeString(getEntryPoint());
68-
serializeNamedArgs(ser, target);
6944
}
70-
7145
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.casper.sdk.model.deploy.executabledeploy;
2+
3+
import com.casper.sdk.model.clvalue.CLValueI32;
4+
import com.casper.sdk.model.clvalue.serde.Target;
5+
import com.casper.sdk.model.deploy.NamedArg;
6+
import com.fasterxml.jackson.core.JsonProcessingException;
7+
import com.fasterxml.jackson.databind.JsonNode;
8+
import com.fasterxml.jackson.databind.ObjectMapper;
9+
import com.syntifi.crypto.key.encdec.Hex;
10+
import dev.oak3.sbs4j.SerializerBuffer;
11+
import dev.oak3.sbs4j.exception.ValueSerializationException;
12+
import org.junit.jupiter.api.Test;
13+
14+
import java.util.Arrays;
15+
16+
import static org.hamcrest.MatcherAssert.assertThat;
17+
import static org.hamcrest.core.Is.is;
18+
import static org.hamcrest.core.IsNull.notNullValue;
19+
20+
/**
21+
* Unit tests for the StoredVersionedContractByHash class.
22+
*
23+
* @author ian@meywood.com
24+
*/
25+
class StoredVersionedContractByHashTest {
26+
27+
@Test
28+
void jsonSerializeStoredVersionedContractByHash() throws ValueSerializationException, JsonProcessingException {
29+
30+
final StoredVersionedContractByHash versionedContractByHash = StoredVersionedContractByHash.builder()
31+
.hash("92173d49744c790d47e50d011d89e1b5a33ed2d9fae8d9459325224d8f98f3e5")
32+
.version(1L)
33+
.entryPoint("counter_inc")
34+
.args(Arrays.asList(new NamedArg<>("one", new CLValueI32(1)), new NamedArg<>("two", new CLValueI32(2))))
35+
.build();
36+
37+
final String json = new ObjectMapper().writeValueAsString(versionedContractByHash);
38+
39+
assertThat(json, is(notNullValue()));
40+
41+
JsonNode root = new ObjectMapper().reader().readTree(json);
42+
assertThat(root.at("/StoredVersionedContractByHash/hash").asText(), is("92173d49744c790d47e50d011d89e1b5a33ed2d9fae8d9459325224d8f98f3e5"));
43+
assertThat(root.at("/StoredVersionedContractByHash/entry_point").asText(), is("counter_inc"));
44+
assertThat(root.at("/StoredVersionedContractByHash/version").asInt(), is(1));
45+
assertThat(root.at("/StoredVersionedContractByHash/args/0/0").asText(), is("one"));
46+
assertThat(root.at("/StoredVersionedContractByHash/args/0/1/bytes").asText(), is("01000000"));
47+
assertThat(root.at("/StoredVersionedContractByHash/args/0/1/cl_type").asText(), is("I32"));
48+
}
49+
50+
@Test
51+
void serializeStoredVersionedContractByHashTest() throws Exception {
52+
53+
final StoredVersionedContractByHash versionedContractByHash = StoredVersionedContractByHash.builder()
54+
.hash("92173d49744c790d47e50d011d89e1b5a33ed2d9fae8d9459325224d8f98f3e5")
55+
.version(1L)
56+
.entryPoint("transfer")
57+
.args(Arrays.asList(new NamedArg<>("one", new CLValueI32(1)), new NamedArg<>("two", new CLValueI32(2))))
58+
.build();
59+
60+
final SerializerBuffer serializerBuffer = new SerializerBuffer();
61+
versionedContractByHash.serialize(serializerBuffer, Target.BYTE);
62+
final String expectedBytes = "0340000000393231373364343937343463373930643437653530643031316438396531623561333365643264396661653864393435393332353232346438663938663365350101000000080000007472616e7366657202000000030000006f6e650400000001000000010300000074776f040000000200000001";
63+
final String actual = Hex.encode(serializerBuffer.toByteArray());
64+
assertThat(actual, is(expectedBytes));
65+
}
66+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package com.casper.sdk.model.deploy.executabledeploy;
2+
3+
import com.casper.sdk.model.clvalue.CLValueI32;
4+
import com.casper.sdk.model.clvalue.serde.Target;
5+
import com.casper.sdk.model.deploy.NamedArg;
6+
import com.fasterxml.jackson.core.JsonProcessingException;
7+
import com.fasterxml.jackson.databind.JsonNode;
8+
import com.fasterxml.jackson.databind.ObjectMapper;
9+
import com.syntifi.crypto.key.encdec.Hex;
10+
import dev.oak3.sbs4j.SerializerBuffer;
11+
import dev.oak3.sbs4j.exception.ValueSerializationException;
12+
import org.junit.jupiter.api.Test;
13+
14+
import java.util.Arrays;
15+
16+
import static org.hamcrest.MatcherAssert.assertThat;
17+
import static org.hamcrest.core.Is.is;
18+
import static org.hamcrest.core.IsNull.notNullValue;
19+
20+
/**
21+
* Unit tests for the StoredVersionedContractByName class
22+
*
23+
* @author ian@meywood.com
24+
*/
25+
class StoredVersionedContractByNameTest {
26+
27+
@Test
28+
void jsonSerializeStoredVersionedContractByName() throws ValueSerializationException, JsonProcessingException {
29+
30+
final StoredVersionedContractByName versionedContractByName = new StoredVersionedContractByName();
31+
32+
versionedContractByName.setName("counter");
33+
versionedContractByName.setEntryPoint("counter_inc");
34+
versionedContractByName.setVersion(1L);
35+
versionedContractByName.setArgs(Arrays.asList(
36+
new NamedArg<>("one", new CLValueI32(1)),
37+
new NamedArg<>("two", new CLValueI32(2))
38+
));
39+
40+
final String json = new ObjectMapper().writeValueAsString(versionedContractByName);
41+
42+
assertThat(json, is(notNullValue()));
43+
44+
JsonNode root = new ObjectMapper().reader().readTree(json);
45+
assertThat(root.at("/StoredVersionedContractByName/name").asText(), is("counter"));
46+
assertThat(root.at("/StoredVersionedContractByName/entry_point").asText(), is("counter_inc"));
47+
assertThat(root.at("/StoredVersionedContractByName/version").asInt(), is(1));
48+
assertThat(root.at("/StoredVersionedContractByName/args/0/0").asText(), is("one"));
49+
assertThat(root.at("/StoredVersionedContractByName/args/0/1/bytes").asText(), is("01000000"));
50+
assertThat(root.at("/StoredVersionedContractByName/args/0/1/cl_type").asText(), is("I32"));
51+
}
52+
53+
@Test
54+
void serializeStoredVersionedContractByHash() throws Exception {
55+
56+
final StoredVersionedContractByName versionedContractByName = new StoredVersionedContractByName();
57+
58+
versionedContractByName.setName("counter");
59+
versionedContractByName.setEntryPoint("transfer");
60+
versionedContractByName.setArgs(Arrays.asList(
61+
new NamedArg<>("one", new CLValueI32(1)),
62+
new NamedArg<>("two", new CLValueI32(2))
63+
));
64+
65+
final SerializerBuffer serializerBuffer = new SerializerBuffer();
66+
versionedContractByName.serialize(serializerBuffer, Target.BYTE);
67+
final String expectedBytes = "0407000000636f756e74657200080000007472616e7366657202000000030000006f6e650400000001000000010300000074776f040000000200000001";
68+
final String actual = Hex.encode(serializerBuffer.toByteArray());
69+
assertThat(actual, is(expectedBytes));
70+
}
71+
}

0 commit comments

Comments
 (0)