Skip to content

Commit 57bd49d

Browse files
Merge pull request #146 from OpenElements/bytes32-support
Bytes32 support
2 parents f83b457 + cffe89e commit 57bd49d

File tree

4 files changed

+91
-0
lines changed

4 files changed

+91
-0
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.openelements.hiero.base.data;
2+
3+
public record Bytes(byte[] bytes) {
4+
}

hiero-enterprise-base/src/main/java/com/openelements/hiero/base/data/ContractParam.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
import com.hedera.hashgraph.sdk.ContractId;
55
import com.openelements.hiero.base.implementation.data.BigIntegerBasedNumericDatatypes;
66
import com.openelements.hiero.base.implementation.data.BooleanDatatype;
7+
import com.openelements.hiero.base.implementation.data.BytesBasedDatatype;
78
import com.openelements.hiero.base.implementation.data.LongBasedNumericDatatypes;
89
import com.openelements.hiero.base.implementation.data.ParamSupplier;
910
import com.openelements.hiero.base.implementation.data.StringBasedDatatype;
1011
import java.math.BigInteger;
12+
import java.nio.charset.StandardCharsets;
1113
import java.util.Objects;
1214
import org.jspecify.annotations.NonNull;
1315

@@ -57,6 +59,26 @@ public static ContractParam<String> string(String value) {
5759
return of(value, StringBasedDatatype.STRING);
5860
}
5961

62+
@NonNull
63+
public static ContractParam<Bytes> bytes(String value) {
64+
return bytes(value.getBytes(StandardCharsets.UTF_8));
65+
}
66+
67+
@NonNull
68+
public static ContractParam<Bytes> bytes32(String value) {
69+
return bytes32(value.getBytes(StandardCharsets.UTF_8));
70+
}
71+
72+
@NonNull
73+
public static ContractParam<Bytes> bytes(byte[] value) {
74+
return of(new Bytes(value), BytesBasedDatatype.BYTES);
75+
}
76+
77+
@NonNull
78+
public static ContractParam<Bytes> bytes32(byte[] value) {
79+
return of(new Bytes(value), BytesBasedDatatype.BYTES32);
80+
}
81+
6082
/**
6183
* Creates a new contract parameter with the given value and native type {@code address}. The input must be address
6284
* in solidty format.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.openelements.hiero.base.implementation.data;
2+
3+
import com.hedera.hashgraph.sdk.ContractFunctionParameters;
4+
import com.openelements.hiero.base.data.Bytes;
5+
import java.util.Objects;
6+
import java.util.function.BiConsumer;
7+
8+
public enum BytesBasedDatatype implements ParamSupplier<Bytes> {
9+
10+
BYTES("bytes", (v, params) -> params.addBytes(v.bytes())),
11+
BYTES32("bytes32", (v, params) -> params.addBytes32(v.bytes()));
12+
13+
private final String nativeType;
14+
15+
private final BiConsumer<Bytes, ContractFunctionParameters> addParam;
16+
17+
BytesBasedDatatype(final String nativeType, final BiConsumer<Bytes, ContractFunctionParameters> addParam) {
18+
this.nativeType = nativeType;
19+
this.addParam = addParam;
20+
}
21+
22+
@Override
23+
public void addParamToFunctionParameters(Bytes value, ContractFunctionParameters params) {
24+
Objects.requireNonNull(value, "value must not be null");
25+
Objects.requireNonNull(params, "params must not be null");
26+
addParam.accept(value, params);
27+
}
28+
29+
@Override
30+
public boolean isValidParam(Bytes value) {
31+
if (value == null) {
32+
return false;
33+
}
34+
if (value.bytes().length > 32 && this.equals(BYTES32)) {
35+
return false;
36+
}
37+
return true;
38+
}
39+
40+
@Override
41+
public String getNativeType() {
42+
return nativeType;
43+
}
44+
}

hiero-enterprise-base/src/main/java/com/openelements/hiero/base/implementation/data/StringBasedDatatype.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22

33
import com.hedera.hashgraph.sdk.AccountId;
44
import com.hedera.hashgraph.sdk.ContractFunctionParameters;
5+
import java.nio.charset.StandardCharsets;
56
import java.util.Objects;
67
import java.util.function.BiConsumer;
78
import org.jspecify.annotations.NonNull;
89

910
public enum StringBasedDatatype implements ParamSupplier<String> {
1011

1112
STRING("string", (v, params) -> params.addString(v)),
13+
BYTES("bytes", (v, params) -> addBytes(v, params)),
14+
BYTES32("bytes32", (v, params) -> addBytes32(v, params)),
1215
ADDRESS("address", (v, params) -> params.addAddress(v));
1316

1417
private final String nativeType;
@@ -43,4 +46,22 @@ public String getNativeType() {
4346
return nativeType;
4447
}
4548

49+
private static void addBytes32(final String value, final ContractFunctionParameters params) {
50+
if (value == null) {
51+
throw new IllegalArgumentException("bytes32 value must not be null");
52+
}
53+
final byte[] bytes = value.getBytes(StandardCharsets.UTF_8);
54+
if (bytes.length > 32) {
55+
throw new IllegalArgumentException("bytes32 value must be 32 bytes or less");
56+
}
57+
params.addBytes32(bytes);
58+
}
59+
60+
private static void addBytes(final String value, final ContractFunctionParameters params) {
61+
if (value == null) {
62+
throw new IllegalArgumentException("bytes32 value must not be null");
63+
}
64+
final byte[] bytes = value.getBytes(StandardCharsets.UTF_8);
65+
params.addBytes(bytes);
66+
}
4667
}

0 commit comments

Comments
 (0)