diff --git a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java index 2eeddf4e6..0559fca03 100644 --- a/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java +++ b/codegen/src/main/java/org/web3j/codegen/SolidityFunctionWrapper.java @@ -587,10 +587,6 @@ private List buildStructTypes(final List functionDefini private static String getStructName(String internalType) { final String fullStructName = internalType.substring(internalType.lastIndexOf(" ") + 1); String tempStructName = fullStructName.substring(fullStructName.lastIndexOf(".") + 1); - int arrayPos = tempStructName.indexOf("["); - if (arrayPos > -1) { - tempStructName = tempStructName.substring(0, arrayPos); - } final String structName = SourceVersion.isName(tempStructName) ? tempStructName : "_" + tempStructName; return structName; @@ -611,6 +607,7 @@ private String adjustToNativeTypeIfNecessary(NamedType component) { } private NamedType normalizeNamedType(NamedType namedType) { + // dynamic array if (namedType.getType().endsWith("[]") && namedType.getInternalType().endsWith("[]")) { return new NamedType( namedType.getName(), @@ -620,6 +617,18 @@ private NamedType normalizeNamedType(NamedType namedType) { .getInternalType() .substring(0, namedType.getInternalType().length() - 2), namedType.isIndexed()); + } else if (namedType.getType().startsWith("tuple[") + && namedType.getInternalType().contains("[") + && namedType.getInternalType().endsWith("]")) { // static array + + return new NamedType( + namedType.getName(), + namedType.getType().substring(0, namedType.getType().indexOf("[")), + namedType.getComponents(), + namedType + .getInternalType() + .substring(0, namedType.getInternalType().indexOf("[")), + namedType.isIndexed()); } else { return namedType; } @@ -637,38 +646,21 @@ private List extractStructs( parameters.addAll(definition.getOutputs()); return parameters.stream() .map(this::normalizeNamedType) - .filter(namedType -> namedType.getType().startsWith("tuple")); + .filter(namedType -> namedType.getType().equals("tuple")); }) .forEach( namedType -> { - if (namedType.getType().startsWith("tuple[")) { - structMap.putIfAbsent( - namedType.flattenNamedType().structIdentifier(), namedType); - } else { - structMap.put(namedType.structIdentifier(), namedType); - } - + structMap.put(namedType.structIdentifier(), namedType); extractNested(namedType).stream() .map(this::normalizeNamedType) .filter( nestedNamedStruct -> - nestedNamedStruct.getType().startsWith("tuple")) + nestedNamedStruct.getType().equals("tuple")) .forEach( - nestedNamedType -> { - if (nestedNamedType - .getType() - .startsWith("tuple[")) { - structMap.putIfAbsent( - nestedNamedType - .flattenNamedType() - .structIdentifier(), - nestedNamedType); - } else { + nestedNamedType -> structMap.put( nestedNamedType.structIdentifier(), - nestedNamedType); - } - }); + nestedNamedType)); }); return structMap.values().stream() diff --git a/core/src/main/java/org/web3j/protocol/core/methods/response/AbiDefinition.java b/core/src/main/java/org/web3j/protocol/core/methods/response/AbiDefinition.java index 12f17d830..e13d61295 100644 --- a/core/src/main/java/org/web3j/protocol/core/methods/response/AbiDefinition.java +++ b/core/src/main/java/org/web3j/protocol/core/methods/response/AbiDefinition.java @@ -298,17 +298,6 @@ public boolean isDynamic() { return components.stream().anyMatch(NamedType::isDynamic); } - public NamedType flattenNamedType() { - int arrayPos = this.type.indexOf("["); - if(arrayPos > 0) return new NamedType( - this.name, - this.type.substring(0, arrayPos), - this.components, - this.internalType.substring(0, this.internalType.indexOf("[")), - this.indexed); - return this; - } - @Override public boolean equals(Object o) { if (this == o) {