Skip to content

Commit e74b2e8

Browse files
committed
Create Event Signature
1 parent b8c4f5d commit e74b2e8

File tree

9 files changed

+80
-35
lines changed

9 files changed

+80
-35
lines changed

abi-parser/pom.xml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,13 @@
2424
<scope>compile</scope>
2525
</dependency>
2626
<dependency>
27-
<groupId>com.github.aelstad</groupId>
28-
<artifactId>keccakj</artifactId>
27+
<groupId>org.bouncycastle</groupId>
28+
<artifactId>bcprov-jdk15to18</artifactId>
29+
</dependency>
30+
<dependency>
31+
<groupId>org.junit.jupiter</groupId>
32+
<artifactId>junit-jupiter</artifactId>
33+
<scope>test</scope>
2934
</dependency>
3035
</dependencies>
3136

abi-parser/src/main/java/com/openelements/hiero/smartcontract/abi/model/AbiEvent.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package com.openelements.hiero.smartcontract.abi.model;
22

33
import com.openelements.hiero.smartcontract.abi.util.HexConverter;
4-
import com.openelements.hiero.smartcontract.abi.util.KeccakSupport;
54
import java.nio.charset.StandardCharsets;
65
import java.util.List;
76
import java.util.Objects;
7+
import org.bouncycastle.jcajce.provider.digest.Keccak;
88
import org.jspecify.annotations.NonNull;
99

1010
public record AbiEvent(@NonNull String name, @NonNull List<AbiParameter> inputs, boolean anonymous) implements AbiEntry{
@@ -21,22 +21,21 @@ public AbiEntryType type() {
2121

2222
@NonNull
2323
public String createEventSignature() {
24-
if(!anonymous) {
25-
throw new IllegalStateException("Cannot create anonymous topic for named event");
26-
}
2724
final List<String> canonicalParameterTypes = inputs.stream().map(AbiParameter::getCanonicalType).toList();
2825
return name + "(" + String.join(",", canonicalParameterTypes) + ")";
2926
}
3027

3128
@NonNull
3229
public byte[] createEventSignatureHash() {
3330
final String eventSignature = createEventSignature();
34-
return KeccakSupport.keccak256(eventSignature.getBytes(StandardCharsets.UTF_8));
31+
Keccak.DigestKeccak kecc = new Keccak.Digest256();
32+
kecc.update(eventSignature.getBytes(StandardCharsets.UTF_8));
33+
return kecc.digest();
3534
}
3635

3736
@NonNull
3837
public String createEventSignatureHashAsHex() {
3938
final byte[] eventSignatureHash = createEventSignatureHash();
40-
return HexConverter.bytesToHex(eventSignatureHash);
39+
return "0x" + HexConverter.bytesToHex(eventSignatureHash);
4140
}
4241
}

abi-parser/src/main/java/com/openelements/hiero/smartcontract/abi/model/AbiParameterType.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ public enum AbiParameterType {
66
BYTE32,
77
BOOL,
88
UINT256,
9+
UINT,
910
TUPLE;
1011

1112
public static AbiParameterType of(final String name) {
@@ -15,6 +16,7 @@ public static AbiParameterType of(final String name) {
1516
case "bytes32" -> BYTE32;
1617
case "bool" -> BOOL;
1718
case "uint256" -> UINT256;
19+
case "uint" -> UINT;
1820
default -> throw new IllegalArgumentException("Unknown value type: " + name);
1921
};
2022
}
@@ -27,6 +29,7 @@ public String getCanonicalType() {
2729
case BOOL -> "bool";
2830
case UINT256 -> "uint256";
2931
case TUPLE -> "tuple";
32+
case UINT -> "uint256";
3033
};
3134
}
3235

abi-parser/src/main/java/com/openelements/hiero/smartcontract/abi/util/HexConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ public static String bytesToHex(@NonNull final byte[] bytes) {
1818
hexChars[j * 2] = HEX_ARRAY[v >>> 4];
1919
hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F];
2020
}
21-
return new String(hexChars, StandardCharsets.UTF_8);
21+
return new String(hexChars, StandardCharsets.UTF_8).toLowerCase();
2222
}
2323
}

abi-parser/src/main/java/com/openelements/hiero/smartcontract/abi/util/KeccakSupport.java

Lines changed: 0 additions & 25 deletions
This file was deleted.

abi-parser/src/main/java/module-info.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
exports com.openelements.hiero.smartcontract.abi.model;
44
exports com.openelements.hiero.smartcontract.abi.util;
55
requires org.jspecify;
6-
requires keccakj;
6+
requires org.bouncycastle.provider;
77
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.openelements.hiero.smartcontract.abi.test;
2+
3+
import com.openelements.hiero.smartcontract.abi.model.AbiEvent;
4+
import com.openelements.hiero.smartcontract.abi.model.AbiParameter;
5+
import com.openelements.hiero.smartcontract.abi.model.AbiParameterType;
6+
import com.openelements.hiero.smartcontract.abi.util.HexConverter;
7+
import java.nio.charset.StandardCharsets;
8+
import java.util.Base64;
9+
import java.util.List;
10+
import org.bouncycastle.jcajce.provider.digest.Keccak;
11+
import org.junit.jupiter.api.Assertions;
12+
import org.junit.jupiter.api.Test;
13+
14+
public class AbiEventTests {
15+
16+
@Test
17+
void testEventSignatureCreation() {
18+
// Given
19+
final List<AbiParameter> inputs = List.of(
20+
new AbiParameter("identifier_", AbiParameterType.STRING, List.of(), false)
21+
);
22+
final AbiEvent event = new AbiEvent("HashAdded", inputs, false);
23+
24+
25+
// When
26+
String signature = event.createEventSignature();
27+
String hashAsHex = event.createEventSignatureHashAsHex();
28+
29+
// Then
30+
Assertions.assertEquals("HashAdded(string)", signature);
31+
Assertions.assertEquals("0xe0c9f5e6f5abddac86dac0e02afc9f3fda7b7fc6d9454a13c51fcb28621e1e5f", hashAsHex);
32+
}
33+
34+
@Test
35+
void testEventSignatureCreation2() {
36+
// Given
37+
final List<AbiParameter> inputs = List.of(
38+
new AbiParameter("count", AbiParameterType.UINT, List.of(), false)
39+
);
40+
final AbiEvent event = new AbiEvent("MissingVerificationCountUpdated", inputs, false);
41+
42+
43+
// When
44+
String signature = event.createEventSignature();
45+
String hashAsHex = event.createEventSignatureHashAsHex();
46+
47+
// Then
48+
Assertions.assertEquals("MissingVerificationCountUpdated(uint256)", signature);
49+
Assertions.assertEquals("0x271219bdbb9b91472a5df68ef7a9d3f8de02f3c27b93a35306f888acf081ea60", hashAsHex);
50+
}
51+
52+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
open module com.openelements.hiero.smartcontract.abi.test {
2+
requires com.openelements.hiero.smartcontract.abi;
3+
requires org.junit.jupiter.api;
4+
requires org.bouncycastle.provider;
5+
}

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
<jreleaser-maven-plugin.version>1.9.0</jreleaser-maven-plugin.version>
6767
<versions-maven-plugin.version>2.17.1</versions-maven-plugin.version>
6868
<keccakj.version>1.1.0</keccakj.version>
69+
<bouncycastle.version>1.76</bouncycastle.version>
6970
</properties>
7071

7172
<dependencyManagement>
@@ -197,6 +198,11 @@
197198
<artifactId>keccakj</artifactId>
198199
<version>${keccakj.version}</version>
199200
</dependency>
201+
<dependency>
202+
<groupId>org.bouncycastle</groupId>
203+
<artifactId>bcprov-jdk15to18</artifactId>
204+
<version>${bouncycastle.version}</version>
205+
</dependency>
200206
</dependencies>
201207
</dependencyManagement>
202208

0 commit comments

Comments
 (0)