Skip to content

Commit 43d8346

Browse files
committed
<fix>(event,codec): fix codec not decode event indexed topic bug.
1 parent a06de5f commit 43d8346

File tree

3 files changed

+40
-5
lines changed

3 files changed

+40
-5
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ ext {
2020
commonsIOVersion = '2.11.0'
2121
commonsLang3Version = '3.12.0'
2222
toml4jVersion = "0.7.2"
23-
bcprovJDK18onVersion = '1.75'
23+
bcprovJDK18onVersion = '1.78'
2424
webankJavaCryptoVersion = "1.0.3"
2525
junitVersion = '4.13.2'
2626
commonsCollections4Version = "4.4"

src/main/java/org/fisco/bcos/sdk/v3/codec/ContractCodec.java

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,7 +1017,7 @@ public List<Object> decodeEvent(String abi, String eventName, EventLog log)
10171017
params =
10181018
ContractCodecTools.decodeJavaObject(inputObject, log.getData(), isWasm);
10191019
}
1020-
List<String> topics = log.getTopics();
1020+
List<String> topics = decodeIndexedEvent(log, abiDefinition);
10211021
return this.mergeEventParamsAndTopics(abiDefinition, params, topics);
10221022
} catch (Exception e) {
10231023
logger.error(" exception in decodeEventToObject : {}", e.getMessage());
@@ -1029,6 +1029,30 @@ public List<Object> decodeEvent(String abi, String eventName, EventLog log)
10291029
throw new ContractCodecException(errorMsg);
10301030
}
10311031

1032+
public List<String> decodeIndexedEvent(EventLog log, ABIDefinition abiDefinition)
1033+
throws ClassNotFoundException {
1034+
List<ABIObject> eventIndexedObject =
1035+
ABIObjectFactory.createEventIndexedObject(abiDefinition);
1036+
List<String> topics = new ArrayList<>();
1037+
if (!log.getTopics().isEmpty()) {
1038+
topics.add(log.getTopics().get(0));
1039+
for (int i = 1; i < log.getTopics().size(); i++) {
1040+
ABIObject indexedObject = eventIndexedObject.get(i - 1);
1041+
if (indexedObject.isDynamic()) {
1042+
topics.add(log.getTopics().get(i));
1043+
} else {
1044+
List<String> objects =
1045+
contractCodecJsonWrapper.decode(
1046+
indexedObject, Hex.decode(log.getTopics().get(i)), isWasm);
1047+
if (!objects.isEmpty()) {
1048+
topics.add(objects.get(0));
1049+
}
1050+
}
1051+
}
1052+
}
1053+
return topics;
1054+
}
1055+
10321056
public List<Object> decodeEventByTopic(String abi, String eventTopic, EventLog log)
10331057
throws ContractCodecException {
10341058
ContractABIDefinition contractABIDefinition = this.abiDefinitionFactory.loadABI(abi);
@@ -1040,7 +1064,7 @@ public List<Object> decodeEventByTopic(String abi, String eventTopic, EventLog l
10401064
if (!log.getData().equals("0x")) {
10411065
params = ContractCodecTools.decodeJavaObject(inputObject, log.getData(), isWasm);
10421066
}
1043-
List<String> topics = log.getTopics();
1067+
List<String> topics = decodeIndexedEvent(log, abiDefinition);
10441068
return this.mergeEventParamsAndTopics(abiDefinition, params, topics);
10451069
} catch (Exception e) {
10461070
logger.error(" exception in decodeEventByTopicToObject : {}", e.getMessage());
@@ -1078,7 +1102,7 @@ public List<String> decodeEventToString(String abi, String eventName, EventLog l
10781102
contractCodecJsonWrapper.decode(
10791103
inputObject, Hex.decode(log.getData()), isWasm);
10801104
}
1081-
List<String> topics = log.getTopics();
1105+
List<String> topics = decodeIndexedEvent(log, abiDefinition);
10821106
return this.mergeEventParamsAndTopicsToString(abiDefinition, params, topics);
10831107
} catch (Exception e) {
10841108
logger.error(" exception in decodeEventToString : {}", e.getMessage());
@@ -1103,7 +1127,7 @@ public List<String> decodeEventByTopicToString(String abi, String eventTopic, Ev
11031127
contractCodecJsonWrapper.decode(
11041128
inputObject, Hex.decode(log.getData()), isWasm);
11051129
}
1106-
List<String> topics = log.getTopics();
1130+
List<String> topics = decodeIndexedEvent(log, abiDefinition);
11071131
return this.mergeEventParamsAndTopicsToString(abiDefinition, params, topics);
11081132
} catch (Exception e) {
11091133
logger.error(" exception in decodeEventByTopicToString : {}", e.getMessage());

src/main/java/org/fisco/bcos/sdk/v3/codec/wrapper/ABIObjectFactory.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.fisco.bcos.sdk.v3.codec.wrapper;
22

33
import java.math.BigInteger;
4+
import java.util.ArrayList;
45
import java.util.List;
56
import org.fisco.bcos.sdk.v3.utils.Numeric;
67
import org.slf4j.Logger;
@@ -37,6 +38,16 @@ private static ABIObject createObject(String name, List<ABIDefinition.NamedType>
3738
return null;
3839
}
3940

41+
public static List<ABIObject> createEventIndexedObject(ABIDefinition abiDefinition) {
42+
ArrayList<ABIObject> abiObjects = new ArrayList<>();
43+
for (ABIDefinition.NamedType namedType : abiDefinition.getInputs()) {
44+
if (namedType.isIndexed()) {
45+
abiObjects.add(buildTypeObject(namedType));
46+
}
47+
}
48+
return abiObjects;
49+
}
50+
4051
public static ABIObject createEventInputObject(ABIDefinition abiDefinition) {
4152
return creatEventObjectWithOutIndexed(abiDefinition.getInputs());
4253
}

0 commit comments

Comments
 (0)